Introduce
- 在 Python 中, 是没有指针这个概念的, 但是我们可以利用 list 实现传引用 (或者说传地址) 的功能
Code
利用 list 传引用
def modify_list(L):
"""Modify the content of a list.
Args:
L: list, len(L) should >= 1
"""
L[0] = 1
L.append(2)
L += [3] # += will not create new object
L = L + [4]
def unitest_modify_list():
L = [0]
modify_list(L)
print(L)
if __name__ == "__main__":
unitest_modify_list()
# results:
[1, 2, 3]
传地址
- 我们可以直接将 Python 中的一个 list 当作指针, 当该 list 中的内容在其它地方被改变时, 我们可以利用类似从地址取值的思想取出该已经被改变的值
import time
from threading import Thread
def pass_pointer(P):
"""Treat `P` as a pointer.
Args:
P: list, len(P) should >= 1
"""
while True:
time.sleep(1)
print(P)
def modify_pointer_content(P):
t = Thread(target=pass_pointer, args=(P,))
t.setDaemon(True)
t.start()
time.sleep(2.1)
P[0] = 1
time.sleep(2.1)
def unitest_pointer():
P = [0]
modify_pointer_content(P)
if __name__ == "__main__":
unitest_pointer()
[0]
[0]
[1]
[1]
- 使用多进程时则不能简单的按照这种方式进行数据通信
import time
from threading import Thread
from multiprocessing import Process
def pass_pointer(P):
"""Treat `P` as a pointer.
Args:
P: list, len(P) should >= 1
"""
while True:
time.sleep(1)
print(P)
def modify_pointer_content(P):
# t = Thread(target=pass_pointer, args=(P,))
t = Process(target=pass_pointer, args=(P,))
# t.setDaemon(True)
t.daemon = True
t.start()
time.sleep(2.1)
P[0] = 1
time.sleep(2.1)
def unitest_pointer():
P = [0]
modify_pointer_content(P)
if __name__ == "__main__":
unitest_pointer()
[0]
[0]
[0]
[0]
Q/A
Q: 除了 list 之外, 利用其它可变对象能否实现传引用/指针的功能
- …
Q: += 与 + 的区别
- …