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) 我有一些大的(超过3个字段)对象,它们可以而且应该是不可变的.每次遇到这种情况时,我倾向于使用长参数列表创建构造函数可恶.它感觉不对,难以使用,可读性受损.
如果字段是某种类似列表的集合类型则更糟糕.一个简单的方法addSibling(S s)
可以简化对象的创建,但会使对象变得可变.
在这种情况下你们有什么用?我在使用Scala和Java,但我认为只要语言是面向对象的,问题就是语言不可知.
我能想到的解决方案:
感谢您的输入!
我遇到了一个问题,我必须存储一个时刻对象的初始值,但是我遇到了一些问题,我阻止了我的变量与原始对象一起变化.
不幸的是,Object.freeze()不起作用,因为当我尝试格式化时,moment.js返回"无效日期"错误.
我的理解是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不应该阻止这项任务吗?我可能错过了一些东西.
任何的想法?
Scala中是否有关于何时使用可变集合的val与使用带有不可变集合的var的指南?或者你真的应该用不可变的集合来瞄准val吗?
事实上,这两种类型的集合给了我很多选择,而且我常常不知道如何做出这种选择.
我知道这可能非常愚蠢,但很多地方声称Java中的Integer类是不可变的,但是下面的代码:
Integer a=3;
Integer b=3;
a+=b;
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
给出(预期)结果毫无困难地执行6.因此,a的值有效地改变了.这不意味着Integer是可变的吗?次要问题和一点offtopic:"不可变类不需要复制构造函数".有人在乎解释原因吗?
我似乎在将数据推送到状态数组时遇到问题.我试图通过这种方式实现它:
this.setState({ myArray: this.state.myArray.push('new value') })
Run Code Online (Sandbox Code Playgroud)
但我认为这是不正确的方式并导致可变性问题?
我指的是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) 如何在Java中创建不可变对象?
应该将哪些对象称为不可变?
如果我有所有静态成员的类是不可变的?
immutability ×10
java ×4
string ×3
javascript ×2
mutability ×2
mutable ×2
python ×2
scala ×2
collections ×1
ios ×1
momentjs ×1
object ×1
objective-c ×1
oop ×1
reactjs ×1
reference ×1
swift ×1