请教一下关于unity字典的问题

新建了个(string,steing)的字典,对字典进行查询的时候,如果comtainskey中直接写string的值是返回true的但是如果给的是变量,就算是同一个字符串也返回的是false是为什么。

img

img

该回答引用GPT与博主@晓码自在合作编写:

这是Unity字典在键比较方式上的差异导致的。

当您直接使用字符串字面量作为字典键进行查询时,Unity会进行值比较(value comparison),判断两个字符串的值是否相等。如果相等,返回True。

但是,当您使用字符串变量作为键进行查询时,Unity会进行对象身份比较(object identity comparison),判断两个变量是否指向完全相同的字符串对象。如果不是,就会返回False。

举个例子:

csharp
Dictionary<string, int> d = new Dictionary<string, int>();
d["a"] = 1;

d["a"]     // Returns 1 
d["a"] == "a" // Also returns True, value comparison

string k = "a";
d[k]      // Also returns 1
d[k] == "a" // Returns True, value comparison

string k2 = "a"; 
d[k2]     // Returns false! k2 is a different variable

尽管k2的值与k相等,但是由于k2是另一个变量,指向的字符串对象与k不同,所以查询失败。

解决方式也有两种:

  1. 在查询前,显式进行值比较,判断变量的值是否相等:
csharp
if (k2 == "a") {
    d[k2];     // Returns 1
}

  1. 在定义字典时,就使用变量作为键:
csharp
string k = "a";
d = new Dictionary<string, int> { {k, 1} };  

d[k];        // Returns 1 
d["a"];      // Also returns 1
d[k2];      // Also returns 1, k2's value is compared

因为字典创建时就记录了k指向的字符串对象,后续查询k2时也会进行值比较,得到正确结果。

这可能是因为你使用的字典库对键的类型进行了限制,只接受某种类型的键,而不接受变量。
你可以尝试将变量转换为字符串类型,然后再作为字典的键来查询。

这可能是因为您使用的Python版本和字典实现方式导致的。在Python 3.9及之前的版本中,字典的实现方式是哈希表(hash table),其中键(key)的顺序是按照其在哈希表中存储的顺序而非其插入的顺序。

如果您在查询字典时,直接使用字符串值作为键,Python会直接在哈希表中查找该键,并返回对应的值。但是,如果您使用的是变量,Python会先将变量的值转换为字符串,然后再在哈希表中查找该键。如果哈希表中存在相同的键值对,但由于键的类型不同(一个是字符串,一个是变量),Python可能会将它们视为不同的键,从而导致查询失败。

为了避免这种情况,您可以确保在查询字典时使用相同的键类型。例如,您可以使用字符串作为键,而不是变量。或者,如果您必须使用变量作为键,请确保将其转换为字符串,以便哈希表能够正确地查找对应的键值对