2024-06-09 17:04:58 发布
网友
我有一个片段:
a = [1,2,3] b = a b = [4,5,6] # a doesnt change
还有这个:
a = [1,2,3] b = a b[0] = 5 # a also changes
b的初始化是如何决定a的可变性的?你知道吗
b
a
当您创建一个列表并将其分配给一个变量时,如
a = [1, 2, 3]
创建一个对象,变量a保存对该对象的引用。当你这么做的时候
b = a
您在b中指定了相同的引用,因此现在a和b都指向您的列表。所以当你执行
b[0] = 5
你改变了同样的清单。你知道吗
通过使用id()函数可以看到这一点,该函数返回对象的内存地址:
>>> a = [1, 2, 3] >>> b = a >>> id(a), id(b) (140454191340720, 140454191340720)
它们是相同的。关键是,a和b本身不是列表,它们指向一个列表。你知道吗
当你这样做的时候:
a = [1, 2, 3] b = a b = [2, 3, 4]
您首先将a指向的列表的引用指定给b,然后再为其指定一个新的引用。你知道吗
顺便说一句,这可能会咬你的背后,当你做一些事情的路线
def foo (a=[]): a.append(42) return a
由于参数a在每次调用时都指向同一个列表,因此如果在没有参数的情况下调用此函数5次,则列表将包含5x 42:
foo(); foo(); foo(); foo(); print(foo()) >>> [42, 42, 42, 42]
当您创建一个列表并将其分配给一个变量时,如
创建一个对象,变量a保存对该对象的引用。当你这么做的时候
您在b中指定了相同的引用,因此现在a和b都指向您的列表。所以当你执行
你改变了同样的清单。你知道吗
通过使用id()函数可以看到这一点,该函数返回对象的内存地址:
它们是相同的。关键是,a和b本身不是列表,它们指向一个列表。你知道吗
当你这样做的时候:
您首先将a指向的列表的引用指定给b,然后再为其指定一个新的引用。你知道吗
顺便说一句,这可能会咬你的背后,当你做一些事情的路线
由于参数a在每次调用时都指向同一个列表,因此如果在没有参数的情况下调用此函数5次,则列表将包含5x 42:
相关问题 更多 >
编程相关推荐