在python中复制一个变量(jupyter)/对相同的变量使用不同的函数
我用python编写了一个小程序,但它不能像预期的那样工作 代码如下:在python中复制一个变量(jupyter)/对相同的变量使用不同的函数,python,function,variables,duplicates,jupyter,Python,Function,Variables,Duplicates,Jupyter,我用python编写了一个小程序,但它不能像预期的那样工作 代码如下: puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6] def count(p): p[0] += 1 return p def main(p): print(p) l = count(p) print(l) print(p) b1 = main(puzzle) 我希望print(p)和print(l)是不同的,但两者的结果是相同的,这是p
puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6]
def count(p):
p[0] += 1
return p
def main(p):
print(p)
l = count(p)
print(l)
print(p)
b1 = main(puzzle)
我希望print(p)和print(l)是不同的,但两者的结果是相同的,这是print(l)应该得到的结果。但是p也改变了,但是我需要它保持不变……这是一种特殊的python行为吗?我错过了什么吗?
我还尝试更改函数中的变量名,但没有帮助。
我重新启动了编译器,但也没用
是否有一种解决方案来存储函数输出,然后再次调用函数,而不让函数更改给定的参数?
那么l将是计算后的结果,p将保持之前的值
亲切问候,,
Joh.您正在传递一个列表参数。参数传递由对象调用。由于列表在这种情况下是一个可变对象,因此它类似于按引用传递,对列表对象的更改将保持不变。如果传递的是不可变的,如整数或字符串,则类似于按副本/值传递,更改不会持久。例如:
def s2asdf(s):
s = "asdf"
s = "hello world"
s2asdf(s)
print s
。。。结果:
$ python example.py
hello world
这是因为Python通过引用传递函数参数。调用
count
函数时,该函数允许该函数修改函数内的列表,并且更改将应用于原始对象
如果希望函数不修改列表,而是返回不同的列表,则必须通过向函数传递副本或在函数内部复制副本来复制列表。在Python中复制列表的方法有很多,但我喜欢使用list()
函数来实现
这将解决您的问题:
puzzle = [8, 7, 5, 4, 1, 2, 3, 0, 6]
def count(p):
new_list = list(p) # copy values of p to new_list
new_list[0] += 1
return new_list
def main(p):
print(p)
l = count(p)
print(l) # l is the new_list returned from count
print(p) # p stays the original value
b1 = main(puzzle)
评估策略不取决于对象的类型,在技术上也不是通过引用传递的,但至少,它不取决于我试图简洁的论点是一个列表这一事实。更新了我的答案,使之更加准确。谢谢@juanpa.arrivillaga
puzzle
,p
(在main()
中)和p
(在count()
中)都是相同列表的名称。通过其中一个名称对列表所做的更改将通过所有名称可见。谢谢!这就是我要找的东西。@iova如果有助于解决问题,你能把答案标记为正确吗?