变量赋值和修改(python中)
当我运行此脚本(Python v2.6)时:变量赋值和修改(python中),python,list,variables,Python,List,Variables,当我运行此脚本(Python v2.6)时: 我希望打印b以输出[1,2]。当我所做的只是改变a时,为什么b变了?b是否永久性地与a绑定?如果是,我能让他们独立吗?怎么做?简短的答案-指针 键入b=a时,设置b查看与a查看的相同数组。您必须使用元素的副本创建一个新数组来分隔它们。在这种情况下,类似于b=[n代表a中的n]的东西可以正常工作。对于更复杂的操作,您可能需要签出。简短回答-指针 键入b=a时,设置b查看与a查看的相同数组。您必须使用元素的副本创建一个新数组来分隔它们。在这种情况下,类似
我希望
打印b
以输出[1,2]
。当我所做的只是改变a时,为什么b变了?b是否永久性地与a绑定?如果是,我能让他们独立吗?怎么做?简短的答案-指针
键入
b=a
时,设置b
查看与a
查看的相同数组。您必须使用元素的副本创建一个新数组来分隔它们。在这种情况下,类似于b=[n代表a中的n]
的东西可以正常工作。对于更复杂的操作,您可能需要签出。简短回答-指针
键入
b=a
时,设置b
查看与a
查看的相同数组。您必须使用元素的副本创建一个新数组来分隔它们。在这种情况下,类似于b=[n代表a中的n]
的东西可以正常工作。对于更复杂的操作,您可能需要签出。Python中的对象是通过引用存储的,您没有将a
的值赋给b
,而是将指针赋给a
所指向的对象
要模拟按值分配,可以制作如下副本:
import copy
b = copy.copy(a)
# now the code works as "expected"
请注意,这有性能缺点
对于数组,有一种特殊的方法依赖于切片:
b = a[:]
# code also works as expected here
更新–除此之外,对于某些对象,您可以使用构造函数,其中包括:
b = list(a)
Python中的对象是通过引用存储的,您不会将
a
的值赋给b
,而是指向a
所指向的对象的指针
要模拟按值分配,可以制作如下副本:
import copy
b = copy.copy(a)
# now the code works as "expected"
请注意,这有性能缺点
对于数组,有一种特殊的方法依赖于切片:
b = a[:]
# code also works as expected here
更新–除此之外,对于某些对象,您可以使用构造函数,其中包括:
b = list(a)
a
是指向列表的指针[1,2]
当您执行赋值b=a
时,b的值是列表的地址[1,2]
因此,当您执行
a.append(3)
时,实际上并不是在更改a
,而是在更改a
指向的列表。由于a
和b
都指向同一个列表,因此当您修改另一个列表时,它们都会发生变化。a
是指向列表的指针[1,2]
当您执行赋值b=a
时,b的值是列表的地址[1,2]
因此,当您执行a.append(3)
时,实际上并不是在更改a
,而是在更改a
指向的列表。由于a
和b
都指向同一个列表,因此当您修改另一个列表时,它们都会发生变化。您可能需要查看链接。这里的问题是a
和b
都指向相同的内存位置,因此更改一个会更改另一个。相反,您希望执行以下操作:
a = [1,2]
b = list(a)
你可能想看看链接。这里的问题是a
和b
都指向相同的内存位置,因此更改一个会更改另一个。相反,您希望执行以下操作:
a = [1,2]
b = list(a)
如果您只是想将列表a的内容复制到b,而不是将b作为指向a的指针:
b = a[:]
使用slice操作符将列表的内容复制到b中,这样您的示例将变成:
a = [1,2]
b = a[:]
a.append(3)
print a
>>>> [1,2,3]
print b
>>>> [1,2]
如果您只是想将列表a的内容复制到b,而不是将b作为指向a的指针:
b = a[:]
使用slice操作符将列表的内容复制到b中,这样您的示例将变成:
a = [1,2]
b = a[:]
a.append(3)
print a
>>>> [1,2,3]
print b
>>>> [1,2]
Python中的内存管理涉及包含所有Python对象和数据结构的私有堆内存位置 Python的运行时只处理对对象的引用(所有对象都存在于堆中):Python堆栈上的总是对其他地方的值的引用
>>> a = [1, 2]
在这里,我们可以清楚地看到变量b
与a
绑定到同一个对象
您可以使用is
操作符测试两个对象在物理上是否相同,也就是说它们在内存中是否具有相同的地址。也可以使用该功能对其进行测试
>>> a is b
>>> True
>>> id(a) == id(b)
>>> True
因此,在这种情况下,您必须明确要求提供副本。
完成此操作后,两个不同的列表对象之间将不再存在连接
>>> b = list(a)
>>> a is b
>>> False
Python中的内存管理涉及一个包含所有Python对象和数据结构的私有堆内存位置 Python的运行时只处理对对象的引用(所有对象都存在于堆中):Python堆栈上的总是对其他地方的值的引用
>>> a = [1, 2]
在这里,我们可以清楚地看到变量b
与a
绑定到同一个对象
您可以使用is
操作符测试两个对象在物理上是否相同,也就是说它们在内存中是否具有相同的地址。也可以使用该功能对其进行测试
>>> a is b
>>> True
>>> id(a) == id(b)
>>> True
因此,在这种情况下,您必须明确要求提供副本。
完成此操作后,两个不同的列表对象之间将不再存在连接
>>> b = list(a)
>>> a is b
>>> False
@Felix我想说他不是一个十足的傻瓜-他不仅仅是问如何克隆,而是问为什么Python会以某种方式运行。”“这是关于这种行为的更好的教程/介绍的很好的一部分。@thegrinner:是的,我有点太快了。只是暗示一下会更好。@Felix我想说他不是个十足的傻瓜-他不仅仅是问如何克隆,而是问为什么Python会以某种方式运行。”“这是关于这种行为的更好的教程/介绍的很好的一部分。@thegrinner:是的,我有点太快了。只是暗示一下会更好。从链接中的文章:“下一次。”