Es geht nicht um ASCII vs. Nicht-ASCII (Ihr "Nicht-ASCII" ist immer noch ASCII, es ist nur Interpunktion, nicht alphanumerisch). CPython als Implementierungsdetail interns string constants that contain only "name characters". "Namenszeichen" bedeutet in diesem Fall dasselbe wie das Regex-Escape \w
: Alphanumerisch, plus Unterstrich.
Hinweis: Dies kann jederzeit geändert werden, und sollte nie verlassen werden, es ist nur eine Optimierung, die sie zufällig verwenden.
Bei einer Vermutung wurde diese Wahl Code zu optimieren gemacht, die getattr
und setattr
verwendet, dict
von einer Handvoll Stringliterale verkeilt s, etc., wobei Internierung bedeutet, dass die Wörterbuch-Lookups oft bis beteiligt endet Zeiger Vergleiche zu tun und die Vermeidung von Vergleichen der Strings überhaupt (wenn zwei Strings interniert sind, sind sie definitionsgemäß entweder das gleiche Objekt oder nicht gleich, so dass Sie vermeiden können, ihre Daten vollständig zu lesen).
Das sind beide ASCII-Zeichenfolgen ... – mgilson
Beachten Sie auch, dass das Internieren (Caching) hier ein CPython-Implementierungsdetail ist und es auf _lots_ der Dinge ankommt. Beachten Sie, dass Sie, wenn Sie dies in ein Skript einfügen, andere Ergebnisse erhalten, als wenn Sie es in der REPL ... – mgilson