سؤال

أحاول مقارنة سلسلتين مع يكون.يتم إرجاع سلسلة واحدة بواسطة دالة، ويتم الإعلان عن الأخرى في المقارنة. يكون اختبارات لهوية الكائن، ولكن وفقا ل هذه الصفحة, ، فهو يعمل أيضًا مع سلسلتين متطابقتين بفضل تحسين ذاكرة Python.لكن ما يلي لا يعمل:

def uSplit(ustring):
        #return user minus host
        return ustring.split('!',1)[0]

user = uSplit('theuser!host')
print type(user)
print user
if user is 'theuser':
    print 'ok'
else:
    print 'failed'

user = 'theuser'

if user is 'theuser':
    print 'ok'

الإخراج:

type 'str'
theuser
failed
ok

أعتقد أن السبب في ذلك هو أن السلسلة التي يتم إرجاعها بواسطة دالة هي "نوع" مختلف من السلسلة عن السلسلة الحرفية.هل هناك أي طريقة للحصول على وظيفة لإرجاع سلسلة حرفية؟أعلم أنه يمكنني استخدامها ==, ، لكني أشعر بالفضول فقط.

هل كانت مفيدة؟

المحلول

الموقع الذي تقتبس منه يقول هذا:

إذا كانت سلسلتين حرفيتين متساويتين، فقد تم وضعهما في نفس موقع الذاكرة.

لكن

uSplit('theuser!host')

ليست سلسلة حرفية - إنها نتيجة عملية على السلسلة الحرفية 'theuser!host'.

على أية حال، لا ينبغي عليك عادة التحقق من مساواة السلسلة باستخدام is, لأن تحسين الذاكرة هذا على أي حال هو مجرد تفاصيل تنفيذ لا يجب الاعتماد عليها.


أيضا، يجب عليك استخدام is لأشياء مثل is None.استخدمه للتحقق مما إذا كان هناك كائنان - من الفئات التي صممتها - لهما نفس المثيل.لا يمكنك استخدامه بسهولة للسلاسل أو الأرقام لأن قواعد إنشاء تلك الفئات المضمنة معقدة.يتم احتجاز بعض السلاسل.وبالمثل، يتم احتجاز بعض الأرقام.

نصائح أخرى

تلك الصفحة التي نقلتها تقول "إذا كانت سلسلتين حرفية متساويان، وقد تم وضعهما في نفس موقع الذاكرة" (التأكيد على ذلك).تقوم بايثون بتدريب السلاسل الحرفية، لكن السلاسل التي يتم إرجاعها من بعض الوظائف العشوائية هي كائنات منفصلة.ال is يمكن اعتبار عامل التشغيل بمثابة مقارنة مؤشر، لذلك لن يتم مقارنة كائنين مختلفين على أنهما متطابقان (حتى لو كانا يحتويان على نفس الأحرف، على سبيل المثال.إنهم متساوون).

ما واجهته هو حقيقة أن بايثون لا تقوم دائمًا بتدريب جميع سلاسلها.مزيد من التفاصيل هنا:

http://mail.python.org/pipermail/tutor/2009-July/070157.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top