Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
参数通过引用传递给python中的类(á;la C+;+;),以使用类方法对其进行修改_Python - Fatal编程技术网

参数通过引用传递给python中的类(á;la C+;+;),以使用类方法对其进行修改

参数通过引用传递给python中的类(á;la C+;+;),以使用类方法对其进行修改,python,Python,在这种情况下,我希望程序打印“X=changed” 字符串是不可变的,因此不能以这种方式更改X ... 另一种方法可能是在全局空间中重新指定X。。。这显然将在许多塞纳里奥失败(即它不是一个全球性的计划) 另一种选择是使用Ashwin建议的可变数据类型 或者最好的选择是,这可能不是一个好主意,您可能不应该这样做…在python中,list和dict类型是全局的,通过引用传递。因此,如果您将变量X的类型更改为其中一种类型,您将获得所需的结果 [编辑:添加了op需要的用例] class Clase:

在这种情况下,我希望程序打印“X=changed”


字符串是不可变的,因此不能以这种方式更改X ... 另一种方法可能是在全局空间中重新指定X。。。这显然将在许多塞纳里奥失败(即它不是一个全球性的计划)

另一种选择是使用Ashwin建议的可变数据类型


或者最好的选择是,这可能不是一个好主意,您可能不应该这样做…

在python
中,list
dict
类型是全局的,通过引用传递。因此,如果您将变量
X
的类型更改为其中一种类型,您将获得所需的结果

[编辑:添加了op需要的用例]

class Clase:
  def __init__(self,variable):
    self.var = variable
  def set_var(self):
    self.var.test = 'changed'

class ComplicatedClass():
    def __init__(self, test):
        self.test = test

X = ComplicatedClass('unchanged')
print('Before:', X.test)

V = Clase(X)
V.set_var()

print("After:",X.test)

>>> Before: unchanged
>>> After: changed

所有值都是对象,在Python中通过引用传递,赋值会更改引用

这里需要注意的是,没有其他语言中的“简单类型”。在Python中,整数是对象。浮动是对象。布尔是对象。赋值总是改变指针指向不同的对象,不管该对象是什么类型的

因此,不可能“通过”引用“赋值”并更改其他人的变量。但是,您可以通过传递可变容器(例如列表或字典)并更改容器的内容来模拟这种情况,如其他人所示

这种通过指针的参数变异在C/C++中很常见,通常用于解决函数只能有一个返回值的问题。Python将很乐意在
return
语句中为您创建元组,并将它们解压缩到另一端的多个变量中,从而使返回多个值变得容易,因此这不是问题。只需返回所有要返回的值。以下是一个简单的例子:

def myfunc(x, y, z):
    return x * 2, y + 5, z - 3
另一方面:

a, b, c = myFunc(4, 5, 6)

在实践中,很少有任何理由需要使用Python执行您正在尝试执行的操作。

字符串是不可变的。。。所有可变参数都是通过引用传递的`最好的选择是,这可能不是一个好主意,您可能不应该这样做……`同意:)或在字符串周围创建可变包装器。这是一个超级拙劣的说法,但在某种程度上,一切都是通过引用传递的,我不确定你想说什么是“全球的”,但这可能不是真的。如果是的话,它肯定不是dicts和list特有的东西。我想我是想说这些数据类型是可变的。谢谢!我有一个疑问。。。我真正的目标是改变一个不是字符串或列表的对象,这是我做的一个复杂的类。你知道我如何创建一个“全局类”吗?这就是我想说的。。。更好的措辞:p谢谢你的回答:我有一个点列表,我想将类定义为多边形、曲线等,只保留连接的点。每个对象多边形或曲线都可以修改点列表,并隐式地影响其他对象。。。因为这个原因,我想这样做。。。也许我的方法是非常非pythonicHard说没有更多的信息,但如果你有一个点列表,你当然可以修改它的内容,而不会遇到任何这样的限制。甚至用完全不同的东西完全替换列表的内容也很容易。不能用其他列表对象代替它。
def myfunc(y):
     y = 13

x = 42       # x now points at the integer object, 42
myfunc(y)    # inside myfunc, y initially points to 42,
             # but myfunc changes its y to point to a
             # different object, 13
print(x)     # prints 42, since changing y inside myfunc
             # does not change any other variable
def myfunc(x, y, z):
    return x * 2, y + 5, z - 3
a, b, c = myFunc(4, 5, 6)