سؤال

لقد أرسلت إشارة إلى كائن BOOL، وتعرضت عليه بطريقة ما. بعد انتهاء الطريقة من تنفيذها، لم تتغير قيمة BOOL خارج الطريقة.

هذا يقودني للاعتقاد بأن المرض بايثون يتم تمريرها بالقيمة. هل هذا صحيح؟ ما أنواع ثعبان أخرى تتصرف بهذه الطريقة؟

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

المحلول

متغيرات Python ليست "مراجع" في إحساس C ++. بدلا من ذلك، فإنها مجرد أسماء محلية ملزمة إلى كائن في موقع تعسفي في الذاكرة. إذا كان هذا الكائن نفسه قابل للتغيير قابلة للتغيير، فسيكون التغييرات المرئية في نطاقات أخرى ملزمة بالكمال. العديد من أنواع البدائية (بما في ذلك bool, int, str, ، و tuple) نكون ثابت ومع ذلك. لا يمكنك تغيير قيمة القيمة؛ بدلا من ذلك، تقوم بتعيين قيمة جديدة على نفس الاسم في نطاقك المحلي.

في الواقع، في أي وقت تقريبا * ترى رمز النموذج foo = X, ، وهذا يعني أن الاسم foo يتم تعيين قيمة جديدة (X) داخل مساحة الاسم المحلية الحالية، وليس هذا موقعا في الذاكرة المسماة بواسطة foo يتم تحديث مؤشرها الداخلي للإشارة بدلا من ذلك إلى موقع X.

* - الاستثناء الوحيد لهذا في بيثون هو أساليب واضطرات الخصائص، والتي قد تسمح لك بالكتابة obj.foo = X ولديها إعادة كتابتها في الخلفية بدلا من ذلك استدعاء طريقة مثل obj.setFoo(X).

نصائح أخرى

ذلك يعتمد على ما إذا كان الكائن قابل للتغيير أو غير قابل للتغيير. الكائنات غير القابلة للتغيير تتصرف وكأنك رأيت مع BOOL، في حين أن الكائنات القابلة للتغيير سوف تتغير.

كمرجع: http://www.testingreflections.com/node/view/5126.

Python يمر المراجع إلى الكائنات حسب القيمة (مثل Java)، وكل شيء في Python هو كائن. هذا يبدو بسيطا، ولكن بعد ذلك ستلاحظ أن بعض أنواع البيانات يبدو أنها تظهر خصائص موضة حسب القيمة، بينما يبدو أن البعض الآخر يتصرف مثل مرجع المرور ... ما هي الصفقة؟

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

الشيء الذي يجب تذكره هو أن هناك رقم الطريقة في Python لوظيفة أو طريقة لإعادة ربط اسم في مساحة اسم المكالمات. عندما تكتب "أرسلت مرجعا إلى كائن Bool، وتعرضت عليه ضمن طريقة"، فما الذي فعلته بالفعل (أنا أخمن) كان من أجل إعادة ربط اسم المعلمة (التي كانت قيمة bool ملزمة بالدعوة) في الداخل طريقة الأسلوب.

بالمختصر، لا توجد متغيرات في بيثون; ؛ هناك أشياء (مثل TRUE و FALSE، تحدث المرض أن تكون ثابتة) وأسماء. الأسماء هي ما تسمون المتغيرات، ولكن الأسماء تنتمي إلى نطاق، لا يمكنك تغيير الأسماء بشكل غير الأسماء غير الأسماء المحلية.

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