- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当将一个变量分配给另一个变量时,它们指向同一个对象。那么,如何在变量仍然指向同一个对象的情况下更改其中一个的值?
a = 10
b = a
a -= 1
print(b) #expect to print 9 but it print 10
如何在python中重新分配变量而不更改其ID?
最佳答案
我不确定您是否对 Python 中的变量或不可变值感到困惑。所以我将解释两者,一半的答案可能看起来像“不,我已经知道了”,但另一半应该有用。
在 Python 中——与 C 不同——变量不是值所在的位置。这只是一个名字。值(value)观随心所欲。1 所以,当你这样做时:
a = 10
b = a
b
成对
a
的引用.这个想法在 Python 中甚至没有意义。您正在制作
a
为
10
取名,然后制作
b
10
的另一个名称.如果你以后这样做:
a = 11
a
为
11
取名,但这对
b
没有影响——它仍然只是
10
的一个名字.
id(a)
没有给你变量的 ID
a
,因为没有这样的东西。
a
只是在某个命名空间(例如,模块的全局字典)中查找的名称。这是值(value),
11
(或者,如果您之前运行过它,则是具有 ID 的不同值
10
)。 (虽然我们在这里:输入的也是值,而不是变量。这里不相关,但值得了解。)
a = [1, 2, 3]
b = a
a
和
b
列表的两个名称。
a[0] = 0
a
, 所以
a
和
b
仍然是同一个列表的名称。它确实分配给
a[0]
,这是该列表的一部分。所以,列表
a
和
b
现在两个名字都成立
[0, 2, 3]
.
a.extend([4, 5])
a
和
b
现在命名列表
[0, 2, 3, 4, 5]
.
a += [6]
a
,或者它只是改变了
a
的值是一个名字吗?事实上,两者兼而有之。这意味着,在幕后,是:
a = a.__iadd__([6])
_tmp = a
_tmp.extend([6])
a = _tmp
a
,但我们正在为它分配与它已经命名的相同的值。同时,我们也在改变那个值,它仍然是
b
的值。名称。
a = 10
b = 10
a += 1
a = a.__iadd__(1)
a
没有定义
__iadd__
方法,所以它回退到这个:
a = a.__add__(1)
11
.
a
成为那个新
11
的名字.同时,
b
仍然是
10
的名字.这就像第一个例子。
a = [10]
b = a
a[0] += 1
b[0]
将是
11
.
class Num:
pass
a = Num()
a.num = 10
b = a
a.num += 1
b.num
是
11
.
__add__
的类。和
__iadd__
和
all the other numeric methods ,因此它可以(几乎)透明地保存数字,但可以可变地这样做。
class Num:
def __init__(self, num):
self.num = num
def __repr__(self):
return f'{type(self).__name__}({self.num})'
def __str__(self):
return str(self.num)
def __add__(self, other):
return type(self)(self.num + other)
def __radd__(self, other):
return type(self)(other + self.num)
def __iadd__(self, other):
self.num += other
return self
# etc.
a = Num(10)
b = a
a += 1
b
是相同的名称
Num(11)
如
a
.
Integer
而不是通用
Num
保存任何类似数字的东西,并在
numbers
中使用适当的 ABC模块来验证您是否涵盖了所有关键方法,获得许多可选方法的免费实现,并能够通过
isinstance
类型检查。 (并且可能以
num.__int__
的方式在其构造函数中调用
int
,或者至少是特殊情况
isinstance(num, Integer)
这样您就不会以对引用的引用结束……除非这是您想要的。)
__new__
使用不依赖于
super
的构造函数分配,否则你别无选择。
__add__
不会变异,
__iadd__
做。所以,像
list
这样的可变类型定义两者,这意味着它们获得了
a += b
的就地行为但复制行为
a + b
, 而不可变类型如
tuple
和
int
仅定义
__add__
,所以他们对两者都有复制行为。 Python 不会强制您以这种方式做事,但是如果它不选择这两种方式中的一种,您的类型就会很奇怪。如果你熟悉 C++,那也是一样的——你通常会实现
operator+=
通过就地变异并返回对
this
的引用, 和
operator+
通过复制然后返回
+=
在副本上,但语言不会强制您这样做,如果您不这样做只会令人困惑。
关于python - 如何在python中重新分配变量而不更改其ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51336185/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!