新建了个(string,steing)的字典,对字典进行查询的时候,如果comtainskey中直接写string的值是返回true的但是如果给的是变量,就算是同一个字符串也返回的是false是为什么。
该回答引用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不同,所以查询失败。
解决方式也有两种:
csharp
if (k2 == "a") {
d[k2]; // Returns 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可能会将它们视为不同的键,从而导致查询失败。
为了避免这种情况,您可以确保在查询字典时使用相同的键类型。例如,您可以使用字符串作为键,而不是变量。或者,如果您必须使用变量作为键,请确保将其转换为字符串,以便哈希表能够正确地查找对应的键值对