如何在 python 中创建对变量的引用?

2025-02-05 13:24:00
admin
原创
69
摘要:问题描述:在代码中:y = 7 x = y x = 8 y将是 7,而 x 将是 8。但我实际上想同时x更改。我可以指定引用并执行此操作吗?y`y`例如,在 C++ 中可以通过以下方式实现相同的目的:int y = 8; int &x = y; x = 9; 现在,y和都x将是 9。解决方案 1:不,...

问题描述:

在代码中:

y = 7
x = y
x = 8

y将是 7,而 x 将是 8。但我实际上想同时x更改。我可以指定引用并执行此操作吗?y`y`

例如,在 C++ 中可以通过以下方式实现相同的目的:

int y = 8;
int &x = y;
x = 9;

现在,y和都x将是 9。


解决方案 1:

不,你不能。正如其他答案指出的那样,你可以(滥用?)使用可变对象的别名来实现类似的效果。但是,这与 C++ 引用不同,我想解释一下实际发生了什么,以避免任何误解。

您会看到,在 C++(和其他语言)中,变量(以及对象字段、集合中的条目等)是一个存储位置,您将一个值(例如,一个整数、一个对象或一个指针)写入该位置。在此模型中,引用是存储位置(任何类型)的别名 - 当您分配给非引用变量时,您会将一个值(即使它只是一个指针,它仍然是一个值)复制到存储位置;当您分配给引用时,您会复制到其他存储位置。请注意,您无法更改引用本身 - 一旦绑定(并且必须在您创建引用后立即绑定),对它的所有赋值都不会改变引用,而是改变所引用的内容。

在 Python(和其他语言)中,变量(以及对象字段、集合中的条目等)只是一个名称。值位于其他地方(例如,散布在整个堆中),变量引用(不是 C++ 引用的意义,更像是指针减去指针算法)一个值。多个名称可以引用同一个值(这通常是一件好事)。Python(和其他语言)将引用值所需的任何内容称为引用,尽管与 C++ 引用和传递引用之类的东西毫无关系。分配给变量(或对象字段等)只会使其引用另一个值。整个存储位置模型不适用于 Python,程序员从不处理值的存储位置。他存储和移动的都是 Python 引用,而这些不是 Python 中的值,因此它们不能成为其他 Python 引用的目标。

所有这些都与值的可变性无关 - 例如,对于 int 和列表也是如此。您不能获取引用任一变量的变量并覆盖它指向的对象。您只能告诉对象修改其自身的部分内容 - 比如,更改它包含的某些引用。

这是一个更严格的模型吗?也许吧,但大多数情况下它已经足够强大了。当它不够强大时,你可以使用下面给出的自定义类或(等效但不太明显的)单元素集合来解决这个问题。

class Reference:
    def __init__(self, val):
        self._value = val # just refers to val, no copy

    def get(self):
        return self._value

    def set(self, val):
        self._value = val

这仍然不允许您为“常规”变量或对象字段设置别名,但您可以让多个变量引用同一个Reference对象(可变单例集合替代方案也是如此)。您只需小心始终使用.get()/ .set()(或[0])。

解决方案 2:

不,Python 没有这个功能。

如果你有一个列表(或任何其他可变对象),你可以通过改变 x 和 y 绑定的对象来做你想做的事情:

>>> x = [7]
>>> y = x
>>> y[0] = 8
>>> print x
[8]

在线查看其工作原理:ideone

解决方案 3:

或者,您可以使用自制的容器。

class Value(object):
    def __init__(self, value): self.value = value

y = Value(7)
x = y
x.value = 8
print y.value

艾迪酮

解决方案 4:

您应该为此使用可变对象。

在 python 中x&y只是对对象的引用,所以y = 7意味着 y 指向对象7
x=y意味着x也指向7,但由于7是不可变的,所以改变 x 的值只会改变对象7并且y仍然指向7

>>> y = [7]
>>> x = y
>>> x[0] = 8 # here you're changing [7] not x or y, x & y are just references to [7]
>>> y
[8]

解决方案 5:

虽然它与 C++ 中的引用不同,但根据使用情况,人们可能会在 Python 标准库中找到Weakref模块。

对对象的弱引用不足以使对象保持活动状态:当对引用对象的唯一剩余引用是弱引用时,垃圾回收可以自由地销毁引用对象并将其内存重新用于其他内容。但是,在对象真正被销毁之前,即使没有对它的强引用,弱引用也可能返回该对象。

弱引用的主要用途是实现保存大对象的缓存或映射,在这种情况下,希望大对象不要仅仅因为出现在缓存或映射中而保持活动状态。

解决方案 6:

我想知道函数 eval() 和 exec() 是否能满足您的需求。

y = 7
x = "y"
eval(x) # 7
y = 8
eval(x) # 8
exec(x+"=9")
y # 9
eval(x) # 9

但我同意,如果你习惯了 C 中的指针,那么没有它们生活会很困难。生活中的女人也一样。所以如果我们在生活中或 Python 中失去了她们,我们会尽最大努力把她们找回来…… :-)

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用