Python 为什么函数可以更改对象变量而不能更改变量

Python 为什么函数可以更改对象变量而不能更改变量,python,Python,这是我不明白的,如果我做了一个函数,它会改变一个变量的值,这只会将它保存在函数中,所以它不会改变全局变量 var = 10 def change_var(variable): variable += 1 change_var(var) print(var) ________________________ 10 但是,当我使用一个对象的变量(我不确定它叫什么)时,它工作得非常好。这对我来说是没有意义的,一个有效,而另一个无效。 这就是我的意思 class foo():

这是我不明白的,如果我做了一个函数,它会改变一个变量的值,这只会将它保存在函数中,所以它不会改变全局变量

var = 10

def change_var(variable):
    variable += 1

change_var(var)

print(var)
________________________

10
但是,当我使用一个对象的变量(我不确定它叫什么)时,它工作得非常好。这对我来说是没有意义的,一个有效,而另一个无效。 这就是我的意思

class foo():
    def __init__(self, var):
        self.var = var

object_ = foo(10)

def change_var(object_):
    object_.var += 1

change_var(object_)

print(object_.var)
________________________

11
我想解释一下为什么一个有效,而另一个无效。Python通过值传递变量,而通过引用传递对象。
因此,如果修改变量,则修改本地副本,而不是原始副本;如果修改对象,则修改原始对象。

Python通过值传递变量,但通过引用传递对象。

因此,如果修改变量,则修改本地副本,而不是原始副本;如果修改对象,则修改原始对象。

您确定代码正确吗?第一个代码中的函数需要一个参数,但您没有提供任何。。。类似地,
\uuuuu init\uuuuu
需要一个位置参数。在这两种情况下,您都在传递对象,没有“传递变量”这样的事情。但是,在第一种情况下,对象是不可变的,它是一个
int
。在第二种情况下,它不是不可变的,它是自定义类的一个实例。这是这里唯一的区别。你接受的答案完全不正确。Python中只有一种求值策略,既不是按值调用,也不是按引用调用。您确定代码是正确的吗?第一个代码中的函数需要一个参数,但您没有提供任何。。。类似地,
\uuuuu init\uuuuu
需要一个位置参数。在这两种情况下,您都在传递对象,没有“传递变量”这样的事情。但是,在第一种情况下,对象是不可变的,它是一个
int
。在第二种情况下,它不是不可变的,它是自定义类的一个实例。这是这里唯一的区别。你接受的答案完全不正确。Python中只有一种求值策略,它既不是按值调用也不是按引用调用绝对不正确。这个答案在两个方面混淆了。Python只有一个评估策略,既不是按值调用,也不是按引用调用。其次,传递“变量”和传递对象之间没有区别,这是绝对错误的。这个答案在两个方面混淆了。Python只有一个评估策略,既不是按值调用,也不是按引用调用。其次,传递“变量”和传递对象之间没有区别