标签: mutability

Python疯狂的可变性

这段代码应该打印什么?

class Parent():
    class Meta(object):
        classattr = "Hello"

class Child(Parent):
    pass


Child.Meta.classattr = "world"


ch = Child()
pr = Parent()

ch.Meta.classattr = "Oppa"

print Parent.Meta.classattr
print Child.Meta.classattr

print pr.Meta.classattr
print ch.Meta.classattr
Run Code Online (Sandbox Code Playgroud)

我期待以下:

Hello
world
Hello
Oppa
Run Code Online (Sandbox Code Playgroud)

但得到了

Oppa
Oppa
Oppa
Oppa
Run Code Online (Sandbox Code Playgroud)

所以......我可以通过修改子类实例来修改父类(而不是实例!).这是正常的吗?

python inheritance mutability

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

Python集不会执行联合

我有一个定义了成员的类:

self.myset = set()
Run Code Online (Sandbox Code Playgroud)

当我执行时myobject.myset.add('item'),使用我的类的一个实例,它工作正常:print(myobject.myset)给我 {'item'} 。

但是,当我执行myobject.myset.union(yourset), whereyourset不为空时,它将不起作用;print(myobject.myset)仍然打印为空集。为什么一种方法 ( add) 有效而另一种方法 ( )union却悄悄地(没有抛出异常)失败?即使myobject.myset = yourset有效,但union尤其不会。

我正在使用 Python 3。

python union scope set mutability

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

Bloch的Effective Java第2版中常量字段的定义

引用:

如果静态final字段具有可变引用类型,则如果引用的对象是不可变的,则它仍然可以是常量字段.

我不确定这是什么意思; 有人能给出一个例子吗?

java immutability mutability effective-java

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

如何根据条件重复向量中的某些元素?

我在kata期间遇到了这个问题.我更具可读性的实现如下:

use std::vec::Vec;

fn repeat_even(v: Vec<i32>) -> Vec<i32> {
    v.into_iter().flat_map(|x| match x % 2 { 0 => vec![x, x], _ => vec![x] }).collect()
}

fn main() {
    let v = vec![1, 2, 3, 4, 6];
    assert_eq!(repeat_even(v), vec![1, 2, 2, 3, 4, 4, 6, 6]);
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  • 是否有必要创造另一个Vec?可以使用相同的Vec,即在迭代时修改它吗?

  • 我认为,我的解决方案效率低下:我分配了很多向量,而且我无法保证这将得到优化.是否有更好的解决方案:可读性和分配更少?

performance vector mutability rust

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

为什么 Option&lt;i32&gt; 在匹配模式中失去可变性?

我想将my_id,仅当存在时更改为另一个值:

fn read(id: &mut i32) {
    *id = 42;
}

struct S {
    my_id: Option<i32>,
}

impl S {
    fn run(&mut self) {
        match self.my_id {
            Some(mut id) => read(&mut id),
            _ => (),
        }
    }
}

fn main() {
    let mut s = S { my_id: 0.into() };

    s.run();

    println!("{:?}", s.my_id);
}
Run Code Online (Sandbox Code Playgroud)

操场

此代码打印Some(0),这意味着替换失败,但我不明白为什么。我是否因为模式匹配而失去了可变性?

pattern-matching mutability rust

3
推荐指数
2
解决办法
81
查看次数

为什么用这种方法将列表变异为它的第一个元素在 Common Lisp 中不起作用?

我正在尝试通过《Common Lisp:符号计算的温和介绍》一书来学习 Common Lisp 。此外,我正在使用 SBCL、Emacs 和 Slime。

到第 10 章结束时,在高级部分有这个问题:

10.9. 编写一个破坏性函数 CHOP,将任何非 NIL 列表缩短为一个元素的列表。(CHOP '(FEE FIE FOE FUM)) 应该返回 (FEE)。

这是答题纸的解决方案:

(defun chop (x)
   (if (consp x) (setf (cdr x) nil)) 
   x)
Run Code Online (Sandbox Code Playgroud)

我理解这个解决方案。但是,在查看官方解决方案之前,我尝试过:

(defun chop (xs)
  (cond ((null xs) xs)
        (t (setf xs (list (car xs))))))
Run Code Online (Sandbox Code Playgroud)

使用它作为测试的全局变量:

(defparameter teste-chop '(a b c d))
Run Code Online (Sandbox Code Playgroud)

我试过 REPL:

CL-USER> (chop teste-chop)
(A)
Run Code Online (Sandbox Code Playgroud)

如您所见,该函数返回预期结果。

不幸的是,不会发生改变原始列表的副作用:

CL-USER> teste-chop
(A B C D)
Run Code Online (Sandbox Code Playgroud)

为什么它没有改变?

由于我将整个列表的字段 (setf) 设置为仅将其汽车包装为新列表,因此我希望原始列表的 cdr …

common-lisp in-place variable-assignment mutability

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

在 Haskell 中,可变性是否总是必须反映在类型系统中?

我是 Haskell 的新手,所以如果这个问题很愚蠢,请原谅。

想象一下,我们有两个绑定到名称x和y 的数据结构。

x是可变的。

y不是。

作为一个问题或原则,x是否一定具有与y不同的类型?

haskell type-theory immutability ghc mutability

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

当我不相信我已经明确声明它们时,为什么给定 HashMap 中的值是可变的?

我为本书第 8.3 节中的第三个建议练习编写了一个可行的解决方案,但有些行为违背了我的直觉。具体来说,我似乎能够改变一个看起来被实例化为不可变的向量。

我已经包含了我认为相关的代码部分,省略了不Vec与HashMap.

我在代码块之后进行了一些猜测,但我确实可以对实际发生的情况进行更可靠的解释。

// Start by declaring a new HashMap. This is where the mystery begins for me.
let mut departments: HashMap<String, Vec<String>> = HashMap::new();

// This code deals with getting user input from stdin and has been elided
// ...

// Match the first string slice
match args[0] {
  
  // Add an employee to a department in the HashMap
  "add" => {
    
    // POINT OF INTEREST 1
    // Adding a department that …
Run Code Online (Sandbox Code Playgroud)

collections hashmap mutability rust

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

Python + =运算符是否使字符串可变?

当我尝试使用+ =运算符修改字符串,并使用id()方法来检查对象的标识时,字符串似乎是可变的.有人面对这种奇怪的python行为吗?

a = '123'

print id(a)
# 89806008

a += '1'

print id(a)
# 89245728

a += '1'

print id(a)
# 89245728

print a

# '12311'
Run Code Online (Sandbox Code Playgroud)

使用 a = a + '1'doesnt具有相同的效果,并更改字符串ID.

python string mutability python-2.7

2
推荐指数
1
解决办法
229
查看次数

Scala - 可变集合中的协变类型

我是Scala世界的新手,现在我正在阅读名为"Scala in Action"的书(Nilanjan Raychaudhuri),即第97页的"可变对象需要不变"的部分,我不明白以下部分直接来自上述书籍.


假设ListBuffer是协变的,以下代码片段在没有任何编译问题的情况下工作:

scala> val mxs: ListBuffer[String] = ListBuffer("pants")
mxs: scala.collection.mutable.ListBuffer[String] =
ListBuffer(pants)
scala> val everything: ListBuffer[Any] = mxs
scala> everything += 1
res4: everything.type = ListBuffer(1, pants)
Run Code Online (Sandbox Code Playgroud)

你能发现问题吗?因为所有内容都是Any类型,所以可以将整数值存储到字符串集合中.这是一场等待发生的灾难.为了避免这些问题,使可变对象不变是一个好主意.


我会有以下问题..

1)everything实际上是什么类型的?String还是Any?声明是" val everything: ListBuffer[Any]",因此我会期望Any,因为一切都应该是类型Any然后我没有看到任何问题,Integer并且String在一个ListBuffer[Any].如何将整数值存储到字符串集合中如何写?为何灾难??? 我为什么要使用List(不可变)而不是ListBuffer(可变)?我没看见有分别.我找到了很多答案,可变集合应该具有类型不变量,并且不可变集合应该具有协变类型,但为什么呢?

2)最后一部分res4: everything.type = ListBuffer(1, pants)是什么意思?"everything.type"是什么意思?我猜这里everything没有任何方法/函数或变量调用type..为什么没有ListBuffer [Any]或ListBuffer [String]?

非常感谢,

安德鲁

scala immutability covariance mutability invariance

2
推荐指数
1
解决办法
177
查看次数