函数更改列表值而不是Python中的变量值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了函数更改列表值而不是Python中的变量值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1974字,纯文字阅读大概需要3分钟。
内容图文
![函数更改列表值而不是Python中的变量值](/upload/InfoBanner/zyjiaocheng/715/ee0477f7d1704631bf1efd9bec1395ac.jpg)
参见英文答案 > Why can a function modify some arguments as perceived by the caller, but not others? 10个
我们来看一个简单的代码:
y = [1,2,3]
def plusOne(y):
for x in range(len(y)):
y[x] += 1
return y
print plusOne(y), y
a = 2
def plusOne2(a):
a += 1
return a
print plusOne2(a), a
‘y’的值发生变化但值’a’保持不变.我已经知道这是因为一个是可变的而另一个不是.但是如何更改代码以使函数不更改列表?
例如,要做类似的事情(为了简单起见,使用伪代码):
a = [1,2,3,...,n]
function doSomething(x):
do stuff with x
return x
b = doSomething(a)
if someOperation(a) > someOperation(b):
do stuff
编辑:抱歉,我在嵌套列表上有另一个问题.看到这段代码:
def change(y):
yN = y[:]
for i in range(len(yN)):
if yN[i][0] == 1:
yN[i][0] = 0
else:
yN[i][0] = 1
return yN
data1 = [[1],[1],[0],[0]]
data2 = change(data1)
在这里它不起作用.为什么?再说一遍:如何避免这个问题?我理解为什么它不起作用:yN = y [:]将y的值复制到yN,但值也是列表,因此对于列表中的每个列表,操作必须加倍.如何使用嵌套列表执行此操作?
解决方法:
Python变量包含对象的指针或引用.所有值(甚至整数)都是对象,赋值将变量更改为指向不同的对象.它不会在变量中存储新值,它会更改变量以引用或指向其他对象.出于这个原因,许多人说Python没有“变量”,它有“名称”,而=操作不“为变量赋值”,而是“将名称绑定到对象”.
在plusOne中,您正在修改(或“改变”)y的内容,但永远不会改变y本身所指的内容.它保持指向同一个列表,即传递给函数的列表.全局变量y和局部变量y引用相同的列表,因此使用任一变量都可以看到更改.由于您更改了传入的对象的内容,因此实际上没有理由返回y(实际上,返回None是Python本身对此类操作所做的操作,即“就地”修改列表 – 值返回创建新对象而不是改变现有对象的操作.
在plusOne2中,您正在更改局部变量a以引用不同的整数对象,3.(“将名称a绑定到对象3”.)全局变量a不会被此更改并继续指向2.
如果您不想更改传入的列表,请复制它并更改它.然后你的函数应该返回新的列表,因为它是创建新对象的那些操作之一,如果你不返回它,新对象将会丢失.您可以将此作为函数的第一行:x = x [:]例如(正如其他人指出的那样).或者,如果以任一方式调用该函数可能有用,则可以让调用者在x [:]中传递,如果他想要复制的话.
内容总结
以上是互联网集市为您收集整理的函数更改列表值而不是Python中的变量值全部内容,希望文章能够帮你解决函数更改列表值而不是Python中的变量值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。