Python 指针

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: += 与 + 的区别

你可能感兴趣的:(python)