首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python永久赋值变量

Python永久赋值变量
EN

Stack Overflow用户
提问于 2010-08-27 10:23:16
回答 4查看 1.3K关注 0票数 0

我刚开始使用python,遇到了一些奇怪的事情。

下面的代码将x=1和y=2的坐标分配给变量test。test2变量为自己分配与TEST值相同的值,然后test2的x值被更改为旧的x值减1。但是,当执行最后一部分时,它不仅从test2中的x值减去1,还对test变量中的x值执行相同的操作。

代码语言:javascript
运行
复制
test = [1,2];
test2 = test;
test2[1] = test2[1] - 1;

我发现执行以下操作很好,但是我仍然不明白为什么第一个方法改变了测试值和test2值。

代码语言:javascript
运行
复制
test = [1,2];
test2 = test;
test2 = [test2[0] -1 ,test2[1]];

有没有人能解释一下为什么会这样。

谢谢你,TheLorax

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-27 10:50:39

在Python语言中,就像在Java语言中一样,赋值本身并不会产生副本--相反,赋值会将另一个引用添加到与=右侧相同的对象中。(参数传递的工作方式与此相同)。奇怪的是,您从来没有听说过这个概念,而Python非常流行,而Java更是如此(许多其他语言也倾向于类似的工作方式,可能会有更复杂或更不同的地方)。

当你想要一个副本时,你需要一个副本(作为右边表达式的一部分,或者用来获取你传递的参数)!在Python语言中,根据您的确切目的,有几种方法--标准库的copy模块是一种流行的方法(使用函数copy,用于“浅层”复制,以及deepcopy --用于“深层”复制,当然,也就是说,不仅是容器,而且是每个包含的项,也会递归地进行深层复制)。

但是,您通常需要的是“新列表”--无论原始序列是列表、副本还是其他可迭代的内容,您可能并不关心:您想要一个新的list实例,它的项与“其他项”的项相同。表达这一点的完美方法是使用list(somethingelse) --调用list类型,它总是创建一个新的list实例,并将其作为参数提供给iterable,您希望在新的list中包含它的项。类似地,dict(somemapping)创建一个新的dictset(someiterable)创建一个新的集合--调用一个类型来创建该类型的新实例是一个非常通用和有用的概念!

票数 4
EN

Stack Overflow用户

发布于 2010-08-27 10:28:46

这是因为当您执行test2 = test时,您并不是在复制列表的内容,而是简单地向test2分配一个对原始列表的引用。因此,对test2的任何更改也会影响test

正确的方法是使用复制模块中的deepcopy() (如果可以进行浅层复制,则使用copy()

代码语言:javascript
运行
复制
import copy
test2 = copy.deepcopy(test) # deep copy

test2 = copy.copy(test)) # shallow copy

test2 = test[:] # shallow copy using slices

有关更深入的解释以及复制列表的其他方法,请参阅this page

票数 3
EN

Stack Overflow用户

发布于 2010-08-27 10:32:00

[1,2]是一个数组,当您将其赋值给test时,您将为该数组分配一个引用以进行测试。因此,当您执行test2=test时,您将引用赋值给另一个变量。对任何变量进行更改,数组都会被更改。

您的第二个示例可以工作,因为您完全创建了一个新数组。你可以像这样做:

代码语言:javascript
运行
复制
test = [1,2]
test2 = [test[0]-1, test[1]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3580913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档