معالجة المؤشرات في بايثون
سؤال
a = [3, 4, 5, 6, 7, 8]
for j in range(1, len(a)): #assigns as index the number given
print(j) #1 2 3 4 5 Iterates from number given on 1st argument to length of "a"
key = a[j]
print(key) #4 5 6 7 8 got index of j given 1, here starts at second number
i = j - 1
print(i) #0 1 2 3 4 because of j - 1
a[i+1] = a[i]
print(i) #0 1 2 3 4
print(a[i]) #3 3 3 3 3 WHY?
i = i - 1
print(i) #-1 0 1 2 3 because of i - 1
a[i+1] = key
print(key) #4 5 6 7 8 [-1+1=0] WHY starts from 4?
سؤالي حقا هو، لماذا التلاعب a[i+' ']
عبث مع القائمة؟هنا هو كما a[i+1]
, ولكن إذا كتبت a[i+3]
إنه يعبث بجميع الأرقام، لماذا يحدث ذلك؟كيف يتم ربطها؟
المحلول
سأتناول هذا التعليق:
print(a[i]) #3 3 3 3 3 WHY?
أنت تقوم أساسًا بنسخ العنصر الأول إلى العنصر الثاني، ثم الثالث، وهكذا.لرؤية ذلك، حاول تشغيل هذا الكود:
a = [3, 4, 5, 6, 7, 8]
for j in range(1, len(a)):
i = j - 1
a[i+1] = a[i]
print(a)
هذه العوائد:
[3, 3, 5, 6, 7, 8]
[3, 3, 3, 6, 7, 8]
[3, 3, 3, 3, 7, 8]
[3, 3, 3, 3, 3, 8]
[3, 3, 3, 3, 3, 3]
لهذا التعليق:
print(key) #4 5 6 7 8 [-1+1=0] WHY starts from 4?
لاحظ أنه في كل تكرار لـ for
حلقة، أنت تقوم بتخزينها مؤقتًا a[j]
إلى متغير محلي يسمى key
.بعد تعديل القائمة عن طريق إجراء مهام مختلفة، سيتم key
سيظل المتغير يحتوي على a[j]
بنهاية الحلقة.لم يتم تعديله!لذلك فمن المنطقي أن طباعة key
لاحقًا سيعطيك نفس النتائج التي حصلت عليها عندما قمت بطباعة الملف key
سابقًا.
نصائح أخرى
مجرد مرجع مستقبلي، بايثون ليس C/C++.لا تحتاج إلى الوصول إلى العناصر عبر فهرسها في ملف for
حلقة.إذا وجدت نفسك بحاجة إلى الفهرس فيجب عليك استخدامه enumerate()
.
for index, value in enumerate(['a', 'b', 'c']):
print(index, value)
سوف يؤدي إلى:
0 'a'
1 'b'
2 'b'
أجد صعوبة في فهم ما تطلبه هنا، لذلك:
print(a[i]) #3 3 3 3 3 WHY?
في التكرار الأول، تقوم بتعيين a[1] = a[0]، أي a[1] = 3.في هذا التكرار الثاني، تقوم بتعيين a[2] = a[1].تم ضبط a[1] مسبقًا على 3، لذا تم ضبط a[2] على ثلاثة.في التكرار الثالث، قمت بتعيين a[3] = a[2]، والذي تم تعيينه مسبقًا على 3...رؤية النمط؟
بالنسبة لسؤالك الأول:a = [3,4,5,6,7,8]
في البداية، ثم عندما تبدأ الحلقة:
الحلقة الأولى:j = 1, key = 4,i = j - 1 = 0
, ، وانت كذلكa[i+1] = a[i]
وهو الآن a[1] = a[0]
, ، لذلك قمت بإعطاء القيمة في a[0] = 3 to a[1]
, ، هكذا هي القائمة a = [3,3,5,6,7,8]
الآن.عند الطباعة a[i]
الذي a[0]
هو 3.وانت كذلك i = i -1
, ، لذا i = -1, a[i+1] = a[0] = key = 4
, ، هكذا هي القائمة [4,3,5,6,7,8]
الآن.
الحلقة الثانية:
j = 2, key = 5,i = j -1 = 1
, ، وانت كذلكa[i+1] = a[i]
وهو الآن a[2] = a[1]
, ، لذلك قمت بإعطاء القيمة في a[1] = 3
(لأننا حصلنا على القائمة الجديدة من الحلقة الأخيرة) إلى a[2]
, ، هكذا هي القائمة a = [4,3,3,6,7,8]
الآن.عند الطباعة a[i]
الذي a[1]
يكون 3
.وانت كذلك i = i - 1, so i = 0, a[i+1] = a[1] = key = 5
, ، هكذا هي القائمة [4,5,3,6,7,8]
الآن.
وبالنسبة لبقية الحلقة، يمكنك الاستنتاج بنفس الطريقة، ثم يمكنك الحصول على الإجابة.نأمل أن يكون هذا مفيدا.