Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
变量赋值和修改(python中)_Python_List_Variables - Fatal编程技术网

变量赋值和修改(python中)

变量赋值和修改(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查看的相同数组。您必须使用元素的副本创建一个新数组来分隔它们。在这种情况下,类似

当我运行此脚本(Python v2.6)时:


我希望
打印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:是的,我有点太快了。只是暗示一下会更好。从链接中的文章:“下一次。”