在python中复制一个变量(jupyter)/对相同的变量使用不同的函数

在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

我用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)是不同的,但两者的结果是相同的,这是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如果有助于解决问题,你能把答案标记为正确吗?