标签: immutability

如果 Python 字符串是不可变的,为什么当我使用 += 附加到它时它会保持相同的 id?

Python 中的字符串是不可变的,这意味着值不能更改。但是,当附加到以下示例中的字符串时,由于 id 保持不变,因此原始字符串内存看起来已被修改:

>>> s = 'String'
>>> for i in range(5, 0, -1):
...     s += str(i)
...     print(f"{s:<11} stored at {id(s)}")
... 
String5     stored at 139841228476848
String54    stored at 139841228476848
String543   stored at 139841228476848
String5432  stored at 139841228476848
String54321 stored at 139841228476848
Run Code Online (Sandbox Code Playgroud)

相反,在以下示例中,id 发生变化:

>>> a = "hello"
>>> id(a)
139841228475760
>>> a = "b" + a[1:]
>>> print(a)
bello
>>> id(a)
139841228475312
Run Code Online (Sandbox Code Playgroud)

python string reference string-concatenation immutability

102
推荐指数
2
解决办法
6958
查看次数

在不使用具有长参数列表的构造函数的情况下构建大的不可变对象

我有一些大的(超过3个字段)对象,它们可以而且应该是不可变的.每次遇到这种情况时,我倾向于使用长参数列表创建构造函数可恶.它感觉不对,难以使用,可读性受损.

如果字段是某种类似列表的集合类型则更糟糕.一个简单的方法addSibling(S s)可以简化对象的创建,但会使对象变得可变.

在这种情况下你们有什么用?我在使用Scala和Java,但我认为只要语言是面向对象的,问题就是语言不可知.

我能想到的解决方案:

  1. "具有长参数列表的构造函数可憎"
  2. Builder模式

感谢您的输入!

java oop scala immutability

96
推荐指数
7
解决办法
1万
查看次数

我如何在moment.js中解决可变性问题?

我遇到了一个问题,我必须存储一个时刻对象的初始值,但是我遇到了一些问题,我阻止了我的变量与原始对象一起变化.

不幸的是,Object.freeze()不起作用,因为当我尝试格式化时,moment.js返回"无效日期"错误.

javascript object immutability mutability momentjs

96
推荐指数
1
解决办法
3万
查看次数

Python字符串不是不可变的吗?那为什么+""+ b有效呢?

我的理解是Python字符串是不可变的.

我尝试了以下代码:

a = "Dog"
b = "eats"
c = "treats"

print a, b, c
# Dog eats treats

print a + " " + b + " " + c
# Dog eats treats

print a
# Dog

a = a + " " + b + " " + c
print a
# Dog eats treats
# !!!
Run Code Online (Sandbox Code Playgroud)

Python不应该阻止这项任务吗?我可能错过了一些东西.

任何的想法?

python string immutability mutability

95
推荐指数
9
解决办法
11万
查看次数

Scala中的val-mutable与var-immutable

Scala中是否有关于何时使用可变集合的val与使用带有不可变集合的var的指南?或者你真的应该用不可变的集合来瞄准val吗?

事实上,这两种类型的集合给了我很多选择,而且我常常不知道如何做出这种选择.

collections functional-programming scala immutability

94
推荐指数
3
解决办法
1万
查看次数

整数是不可改变的

我知道这可能非常愚蠢,但很多地方声称Java中的Integer类是不可变的,但是下面的代码:

Integer a=3;
Integer b=3;
a+=b;
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)

给出(预期)结果毫无困难地执行6.因此,a的值有效地改变了.这不意味着Integer是可变的吗?次要问题和一点offtopic:"不可变类不需要复制构造函数".有人在乎解释原因吗?

java mutable immutability

93
推荐指数
6
解决办法
6万
查看次数

正确推入状态数组的方法

我似乎在将数据推送到状态数组时遇到问题.我试图通过这种方式实现它:

this.setState({ myArray: this.state.myArray.push('new value') })
Run Code Online (Sandbox Code Playgroud)

但我认为这是不正确的方式并导致可变性问题?

javascript immutability reactjs

91
推荐指数
8
解决办法
17万
查看次数

Swift中的不可变/可变集合

我指的是Apple的Swift编程指南,用于理解用Swift语言创建Mutable/immutable对象(Array,Dictionary,Sets,Data).但我无法理解如何在Swift中创建不可变的集合.

我想在Objective-C中看到Swift中的等价物

不可变阵列

NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
Run Code Online (Sandbox Code Playgroud)

可变阵列

NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];
Run Code Online (Sandbox Code Playgroud)

不变字典

NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
Run Code Online (Sandbox Code Playgroud)

可变字典

NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
Run Code Online (Sandbox Code Playgroud)

objective-c mutable immutability ios swift

83
推荐指数
4
解决办法
8万
查看次数

不变的课程?

如何使Java类不可变,对不可变性的需求是什么,使用它有什么好处?

java string immutability

81
推荐指数
4
解决办法
5万
查看次数

如何在Java中创建不可变对象?

如何在Java中创建不可变对象?

应该将哪些对象称为不可变?

如果我有所有静态成员的类是不可变的?

java immutability

80
推荐指数
6
解决办法
8万
查看次数