Why can I use a list index as an indexing variable in a for loop? The 2019 Stack Overflow Developer Survey Results Are InHow do I check if a list is empty?Finding the index of an item given a list containing it in PythonAccessing the index in 'for' loops?Understanding Python super() with __init__() methodsHow do I sort a dictionary by value?How to make a flat list out of list of lists?How do I pass a variable by reference?Loop through an array in JavaScriptHow do I list all files of a directory?Why is printing “B” dramatically slower than printing “#”?

What do I do when my TA workload is more than expected?

Are spiders unable to hurt humans, especially very small spiders?

What to do when moving next to a bird sanctuary with a loosely-domesticated cat?

Why does the nucleus not repel itself?

How do I free up internal storage if I don't have any apps downloaded?

Why “相同意思的词” is called “同义词” instead of "同意词"?

What does もの mean in this sentence?

Keeping a retro style to sci-fi spaceships?

Why doesn't UInt have a toDouble()?

How to notate time signature switching consistently every measure

Did any laptop computers have a built-in 5 1/4 inch floppy drive?

"as much details as you can remember"

Is Cinnamon a desktop environment or a window manager? (Or both?)

Mathematics of imaging the black hole

How can I add encounters in the Lost Mine of Phandelver campaign without giving PCs too much XP?

What is the meaning of Triage in Cybersec world?

What is this business jet?

How come people say “Would of”?

Dropping list elements from nested list after evaluation

What is this sharp, curved notch on my knife for?

What information about me do stores get via my credit card?

Likelihood that a superbug or lethal virus could come from a landfill

Does HR tell a hiring manager about salary negotiations?

What is the most efficient way to store a numeric range?



Why can I use a list index as an indexing variable in a for loop?



The 2019 Stack Overflow Developer Survey Results Are InHow do I check if a list is empty?Finding the index of an item given a list containing it in PythonAccessing the index in 'for' loops?Understanding Python super() with __init__() methodsHow do I sort a dictionary by value?How to make a flat list out of list of lists?How do I pass a variable by reference?Loop through an array in JavaScriptHow do I list all files of a directory?Why is printing “B” dramatically slower than printing “#”?



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








12















I have the following code:



a = [0,1,2,3]

for a[-1] in a:
print(a[-1])


The output is:



0
1
2
2


I'm confused about why a list index can be used as an indexing variable in a for a loop?










share|improve this question









New contributor




Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 7





    Somehow this question looks like a bad and newbie question, but I don't get the logic either lol

    – gameon67
    1 hour ago






  • 4





    I don't know why you would ever want to do this, but now I know you can

    – Nathan
    1 hour ago











  • over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.

    – Arun Augustine
    56 mins ago







  • 7





    This would be a great question for an awful coding interview

    – Nathan
    53 mins ago






  • 1





    OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.

    – Christian Dean
    31 mins ago

















12















I have the following code:



a = [0,1,2,3]

for a[-1] in a:
print(a[-1])


The output is:



0
1
2
2


I'm confused about why a list index can be used as an indexing variable in a for a loop?










share|improve this question









New contributor




Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 7





    Somehow this question looks like a bad and newbie question, but I don't get the logic either lol

    – gameon67
    1 hour ago






  • 4





    I don't know why you would ever want to do this, but now I know you can

    – Nathan
    1 hour ago











  • over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.

    – Arun Augustine
    56 mins ago







  • 7





    This would be a great question for an awful coding interview

    – Nathan
    53 mins ago






  • 1





    OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.

    – Christian Dean
    31 mins ago













12












12








12


7






I have the following code:



a = [0,1,2,3]

for a[-1] in a:
print(a[-1])


The output is:



0
1
2
2


I'm confused about why a list index can be used as an indexing variable in a for a loop?










share|improve this question









New contributor




Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












I have the following code:



a = [0,1,2,3]

for a[-1] in a:
print(a[-1])


The output is:



0
1
2
2


I'm confused about why a list index can be used as an indexing variable in a for a loop?







python for-loop






share|improve this question









New contributor




Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 23 mins ago









Amir A. Shabani

457616




457616






New contributor




Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 1 hour ago









Kundan VermaKundan Verma

712




712




New contributor




Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Kundan Verma is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







  • 7





    Somehow this question looks like a bad and newbie question, but I don't get the logic either lol

    – gameon67
    1 hour ago






  • 4





    I don't know why you would ever want to do this, but now I know you can

    – Nathan
    1 hour ago











  • over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.

    – Arun Augustine
    56 mins ago







  • 7





    This would be a great question for an awful coding interview

    – Nathan
    53 mins ago






  • 1





    OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.

    – Christian Dean
    31 mins ago












  • 7





    Somehow this question looks like a bad and newbie question, but I don't get the logic either lol

    – gameon67
    1 hour ago






  • 4





    I don't know why you would ever want to do this, but now I know you can

    – Nathan
    1 hour ago











  • over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.

    – Arun Augustine
    56 mins ago







  • 7





    This would be a great question for an awful coding interview

    – Nathan
    53 mins ago






  • 1





    OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.

    – Christian Dean
    31 mins ago







7




7





Somehow this question looks like a bad and newbie question, but I don't get the logic either lol

– gameon67
1 hour ago





Somehow this question looks like a bad and newbie question, but I don't get the logic either lol

– gameon67
1 hour ago




4




4





I don't know why you would ever want to do this, but now I know you can

– Nathan
1 hour ago





I don't know why you would ever want to do this, but now I know you can

– Nathan
1 hour ago













over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.

– Arun Augustine
56 mins ago






over the iteration only the last time a[-1] gets its value, all other times python treats as iteration variable.

– Arun Augustine
56 mins ago





7




7





This would be a great question for an awful coding interview

– Nathan
53 mins ago





This would be a great question for an awful coding interview

– Nathan
53 mins ago




1




1





OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.

– Christian Dean
31 mins ago





OP, since it seems like your post may be gaining some traffic, I edited your post in an attempt to make your question clearer. If I'm misinterpreting your question, you can rollback the edit.

– Christian Dean
31 mins ago












5 Answers
5






active

oldest

votes


















10














To bring a language-lawyer aspect to the question, let's look at documentation:




for_stmt ::= "for" target_list "in" expression_list ":" suite


The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the expression_list. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.




(emphasis not originally in docs)
The suite refers to the statements under the for-block. print(a[-1]) in OP's example.



Simply, on each iteration, the loop variable (target_list) gets assigned to the next item in the iterable (expression_list).



Let's extend the print statement:



a = [0, 1, 2, 3]
for a[-1] in a:
print(a, a[-1])


This gives the following output:



[0, 1, 2, 0] 0 # a[-1] assigned 0
[0, 1, 2, 1] 1 # a[-1] assigned 1
[0, 1, 2, 2] 2 # a[-1] assigned 2
[0, 1, 2, 2] 2 # a[-1] assigned itself (2)


As a[-1] is a valid form left-hand side, assignments to a[-1] will mutate a, modifying the list during iteration. In this particular example, a[-1] retains -2 from the previous evaluation. If we trace the assignment on each iteration, we have



a[-1] = 0 # a[0] # a[3] is 0 now
a[-1] = 1 # a[1] # a[3] is 1 now
a[-1] = 2 # a[2] # a[3] is 2 now
a[-1] = 2 # a[3] # a[3] is itself (2)





share|improve this answer




















  • 2





    Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.

    – Mateen Ulhaq
    48 mins ago







  • 2





    Essentially, the important thing to note here is that Python considers a[-1] to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1 is valid grammar). Thus a[-1] is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.

    – Christian Dean
    36 mins ago


















2














it is an interesting question, you can understand it by that:



for v in a:
a[-1] = v
print(a[-1])

print(a)


actually a becomes: [0, 1, 2, 2] after loop



output:



0
1
2
2
[0, 1, 2, 2]


Hope that helps you, and comment if you have further questions. : )






share|improve this answer






























    2














    (this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)



    If you had



    x = 0
    l = [1, 2, 3]
    for x in l:
    print(x)


    you wouldn't be surprised that x is overriden each time through the loop. Even though x existed before, its value isn't used (i.e. for 0 in l:, which would throw an error). Rather, we assign the values from l to x.



    When we do



    a = [0, 1, 2, 3]

    for a[-1] in a:
    print(a[-1])


    even though a[-1] already exists and has a value, we don't put that value in but rather assign to a[-1] each time through the loop.






    share|improve this answer

























    • Somehow I thought the variable used in for loop is immutable. +1 for pointing it out.

      – Amir A. Shabani
      39 mins ago


















    1














    The left expression of a for loop statement gets assigned with each item in the iterable on the right in each iteration, so



    for n in a:
    print(n)


    is just a fancy way of doing:



    for i in range(len(a)):
    n = a[i]
    print(n)


    Likewise,



    for a[-1] in a:
    print(a[-1])


    is just a fancy way of doing:



    for i in range(len(a)):
    a[-1] = a[i]
    print(a[-1])


    where in each iteration, the last item of a gets assigned with the next item in a, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2.






    share|improve this answer






























      1














      a[-1] refers to the last element of a, in this case a[3]. The for loop is a bit unusual in that it is using this element as the loop variable.
      It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.



      So first a[-1] gets set to 0, then 1, then 2. Finally, on the last iteration, the for loop retrieves a[3] which at that point is 2, so the list ends up as [0, 1, 2, 2].



      A more typical for loop uses a simple local variable name as the loop variable, e.g. for x .... In that case, x is set to the next value upon each iteration. This case is no different, except that a[-1] is set to the next value upon each iteration. You don't see this very often, but it's consistent.






      share|improve this answer

























      • How does it actually gets set to 0, then 1, then 2 and finally 2? That's the confusing part!

        – Amir A. Shabani
        1 hour ago






      • 1





        Agree, I don't really understand by reading this answer

        – gameon67
        1 hour ago











      • I expected it would be like saying for 3 in a: print(a[-1]) (because a[-1] was 3 at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.

        – Nathan
        1 hour ago











      • It's set by the for loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.

        – Tom Karzes
        1 hour ago






      • 1





        "The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element a[-1] evaluates to, rather, it's using the index a[-1] itself. If you rephrase that statement, your answer becomes much more clear.

        – Christian Dean
        28 mins ago












      Your Answer






      StackExchange.ifUsing("editor", function ()
      StackExchange.using("externalEditor", function ()
      StackExchange.using("snippets", function ()
      StackExchange.snippets.init();
      );
      );
      , "code-snippets");

      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "1"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );






      Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.









      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55644201%2fwhy-can-i-use-a-list-index-as-an-indexing-variable-in-a-for-loop%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      5 Answers
      5






      active

      oldest

      votes








      5 Answers
      5






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      10














      To bring a language-lawyer aspect to the question, let's look at documentation:




      for_stmt ::= "for" target_list "in" expression_list ":" suite


      The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the expression_list. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.




      (emphasis not originally in docs)
      The suite refers to the statements under the for-block. print(a[-1]) in OP's example.



      Simply, on each iteration, the loop variable (target_list) gets assigned to the next item in the iterable (expression_list).



      Let's extend the print statement:



      a = [0, 1, 2, 3]
      for a[-1] in a:
      print(a, a[-1])


      This gives the following output:



      [0, 1, 2, 0] 0 # a[-1] assigned 0
      [0, 1, 2, 1] 1 # a[-1] assigned 1
      [0, 1, 2, 2] 2 # a[-1] assigned 2
      [0, 1, 2, 2] 2 # a[-1] assigned itself (2)


      As a[-1] is a valid form left-hand side, assignments to a[-1] will mutate a, modifying the list during iteration. In this particular example, a[-1] retains -2 from the previous evaluation. If we trace the assignment on each iteration, we have



      a[-1] = 0 # a[0] # a[3] is 0 now
      a[-1] = 1 # a[1] # a[3] is 1 now
      a[-1] = 2 # a[2] # a[3] is 2 now
      a[-1] = 2 # a[3] # a[3] is itself (2)





      share|improve this answer




















      • 2





        Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.

        – Mateen Ulhaq
        48 mins ago







      • 2





        Essentially, the important thing to note here is that Python considers a[-1] to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1 is valid grammar). Thus a[-1] is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.

        – Christian Dean
        36 mins ago















      10














      To bring a language-lawyer aspect to the question, let's look at documentation:




      for_stmt ::= "for" target_list "in" expression_list ":" suite


      The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the expression_list. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.




      (emphasis not originally in docs)
      The suite refers to the statements under the for-block. print(a[-1]) in OP's example.



      Simply, on each iteration, the loop variable (target_list) gets assigned to the next item in the iterable (expression_list).



      Let's extend the print statement:



      a = [0, 1, 2, 3]
      for a[-1] in a:
      print(a, a[-1])


      This gives the following output:



      [0, 1, 2, 0] 0 # a[-1] assigned 0
      [0, 1, 2, 1] 1 # a[-1] assigned 1
      [0, 1, 2, 2] 2 # a[-1] assigned 2
      [0, 1, 2, 2] 2 # a[-1] assigned itself (2)


      As a[-1] is a valid form left-hand side, assignments to a[-1] will mutate a, modifying the list during iteration. In this particular example, a[-1] retains -2 from the previous evaluation. If we trace the assignment on each iteration, we have



      a[-1] = 0 # a[0] # a[3] is 0 now
      a[-1] = 1 # a[1] # a[3] is 1 now
      a[-1] = 2 # a[2] # a[3] is 2 now
      a[-1] = 2 # a[3] # a[3] is itself (2)





      share|improve this answer




















      • 2





        Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.

        – Mateen Ulhaq
        48 mins ago







      • 2





        Essentially, the important thing to note here is that Python considers a[-1] to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1 is valid grammar). Thus a[-1] is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.

        – Christian Dean
        36 mins ago













      10












      10








      10







      To bring a language-lawyer aspect to the question, let's look at documentation:




      for_stmt ::= "for" target_list "in" expression_list ":" suite


      The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the expression_list. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.




      (emphasis not originally in docs)
      The suite refers to the statements under the for-block. print(a[-1]) in OP's example.



      Simply, on each iteration, the loop variable (target_list) gets assigned to the next item in the iterable (expression_list).



      Let's extend the print statement:



      a = [0, 1, 2, 3]
      for a[-1] in a:
      print(a, a[-1])


      This gives the following output:



      [0, 1, 2, 0] 0 # a[-1] assigned 0
      [0, 1, 2, 1] 1 # a[-1] assigned 1
      [0, 1, 2, 2] 2 # a[-1] assigned 2
      [0, 1, 2, 2] 2 # a[-1] assigned itself (2)


      As a[-1] is a valid form left-hand side, assignments to a[-1] will mutate a, modifying the list during iteration. In this particular example, a[-1] retains -2 from the previous evaluation. If we trace the assignment on each iteration, we have



      a[-1] = 0 # a[0] # a[3] is 0 now
      a[-1] = 1 # a[1] # a[3] is 1 now
      a[-1] = 2 # a[2] # a[3] is 2 now
      a[-1] = 2 # a[3] # a[3] is itself (2)





      share|improve this answer















      To bring a language-lawyer aspect to the question, let's look at documentation:




      for_stmt ::= "for" target_list "in" expression_list ":" suite


      The expression list is evaluated once; it should yield an iterable object. An iterator is created for the result of the expression_list. The suite is then executed once for each item provided by the iterator, in the order returned by the iterator. Each item in turn is assigned to the target list using the standard rules for assignments (see Assignment statements), and then the suite is executed.




      (emphasis not originally in docs)
      The suite refers to the statements under the for-block. print(a[-1]) in OP's example.



      Simply, on each iteration, the loop variable (target_list) gets assigned to the next item in the iterable (expression_list).



      Let's extend the print statement:



      a = [0, 1, 2, 3]
      for a[-1] in a:
      print(a, a[-1])


      This gives the following output:



      [0, 1, 2, 0] 0 # a[-1] assigned 0
      [0, 1, 2, 1] 1 # a[-1] assigned 1
      [0, 1, 2, 2] 2 # a[-1] assigned 2
      [0, 1, 2, 2] 2 # a[-1] assigned itself (2)


      As a[-1] is a valid form left-hand side, assignments to a[-1] will mutate a, modifying the list during iteration. In this particular example, a[-1] retains -2 from the previous evaluation. If we trace the assignment on each iteration, we have



      a[-1] = 0 # a[0] # a[3] is 0 now
      a[-1] = 1 # a[1] # a[3] is 1 now
      a[-1] = 2 # a[2] # a[3] is 2 now
      a[-1] = 2 # a[3] # a[3] is itself (2)






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited 32 mins ago

























      answered 51 mins ago









      TrebledJTrebledJ

      3,76421329




      3,76421329







      • 2





        Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.

        – Mateen Ulhaq
        48 mins ago







      • 2





        Essentially, the important thing to note here is that Python considers a[-1] to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1 is valid grammar). Thus a[-1] is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.

        – Christian Dean
        36 mins ago












      • 2





        Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.

        – Mateen Ulhaq
        48 mins ago







      • 2





        Essentially, the important thing to note here is that Python considers a[-1] to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1 is valid grammar). Thus a[-1] is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.

        – Christian Dean
        36 mins ago







      2




      2





      Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.

      – Mateen Ulhaq
      48 mins ago






      Might be useful to bold Each item [...] is assigned to the target list using the standard rules for assignments.

      – Mateen Ulhaq
      48 mins ago





      2




      2





      Essentially, the important thing to note here is that Python considers a[-1] to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1 is valid grammar). Thus a[-1] is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.

      – Christian Dean
      36 mins ago





      Essentially, the important thing to note here is that Python considers a[-1] to be a valid form of the left-hand side of an assignment statement (e.g. a[-1] = 1 is valid grammar). Thus a[-1] is a valid "variable" name, because as the documentation stated, it evaluates the binding variable(s) in a for loop declaration as it would the left-hand side of an assignment.

      – Christian Dean
      36 mins ago













      2














      it is an interesting question, you can understand it by that:



      for v in a:
      a[-1] = v
      print(a[-1])

      print(a)


      actually a becomes: [0, 1, 2, 2] after loop



      output:



      0
      1
      2
      2
      [0, 1, 2, 2]


      Hope that helps you, and comment if you have further questions. : )






      share|improve this answer



























        2














        it is an interesting question, you can understand it by that:



        for v in a:
        a[-1] = v
        print(a[-1])

        print(a)


        actually a becomes: [0, 1, 2, 2] after loop



        output:



        0
        1
        2
        2
        [0, 1, 2, 2]


        Hope that helps you, and comment if you have further questions. : )






        share|improve this answer

























          2












          2








          2







          it is an interesting question, you can understand it by that:



          for v in a:
          a[-1] = v
          print(a[-1])

          print(a)


          actually a becomes: [0, 1, 2, 2] after loop



          output:



          0
          1
          2
          2
          [0, 1, 2, 2]


          Hope that helps you, and comment if you have further questions. : )






          share|improve this answer













          it is an interesting question, you can understand it by that:



          for v in a:
          a[-1] = v
          print(a[-1])

          print(a)


          actually a becomes: [0, 1, 2, 2] after loop



          output:



          0
          1
          2
          2
          [0, 1, 2, 2]


          Hope that helps you, and comment if you have further questions. : )







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 53 mins ago









          recnacrecnac

          1,218123




          1,218123





















              2














              (this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)



              If you had



              x = 0
              l = [1, 2, 3]
              for x in l:
              print(x)


              you wouldn't be surprised that x is overriden each time through the loop. Even though x existed before, its value isn't used (i.e. for 0 in l:, which would throw an error). Rather, we assign the values from l to x.



              When we do



              a = [0, 1, 2, 3]

              for a[-1] in a:
              print(a[-1])


              even though a[-1] already exists and has a value, we don't put that value in but rather assign to a[-1] each time through the loop.






              share|improve this answer

























              • Somehow I thought the variable used in for loop is immutable. +1 for pointing it out.

                – Amir A. Shabani
                39 mins ago















              2














              (this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)



              If you had



              x = 0
              l = [1, 2, 3]
              for x in l:
              print(x)


              you wouldn't be surprised that x is overriden each time through the loop. Even though x existed before, its value isn't used (i.e. for 0 in l:, which would throw an error). Rather, we assign the values from l to x.



              When we do



              a = [0, 1, 2, 3]

              for a[-1] in a:
              print(a[-1])


              even though a[-1] already exists and has a value, we don't put that value in but rather assign to a[-1] each time through the loop.






              share|improve this answer

























              • Somehow I thought the variable used in for loop is immutable. +1 for pointing it out.

                – Amir A. Shabani
                39 mins ago













              2












              2








              2







              (this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)



              If you had



              x = 0
              l = [1, 2, 3]
              for x in l:
              print(x)


              you wouldn't be surprised that x is overriden each time through the loop. Even though x existed before, its value isn't used (i.e. for 0 in l:, which would throw an error). Rather, we assign the values from l to x.



              When we do



              a = [0, 1, 2, 3]

              for a[-1] in a:
              print(a[-1])


              even though a[-1] already exists and has a value, we don't put that value in but rather assign to a[-1] each time through the loop.






              share|improve this answer















              (this is more of a long comment than an answer - there are a couple of good ones already, especially @TrebledJ's. But I had to think of it explicitly in terms of overwriting variables that already have values before it clicked for me.)



              If you had



              x = 0
              l = [1, 2, 3]
              for x in l:
              print(x)


              you wouldn't be surprised that x is overriden each time through the loop. Even though x existed before, its value isn't used (i.e. for 0 in l:, which would throw an error). Rather, we assign the values from l to x.



              When we do



              a = [0, 1, 2, 3]

              for a[-1] in a:
              print(a[-1])


              even though a[-1] already exists and has a value, we don't put that value in but rather assign to a[-1] each time through the loop.







              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited 36 mins ago









              Amir A. Shabani

              457616




              457616










              answered 43 mins ago









              NathanNathan

              2,02511326




              2,02511326












              • Somehow I thought the variable used in for loop is immutable. +1 for pointing it out.

                – Amir A. Shabani
                39 mins ago

















              • Somehow I thought the variable used in for loop is immutable. +1 for pointing it out.

                – Amir A. Shabani
                39 mins ago
















              Somehow I thought the variable used in for loop is immutable. +1 for pointing it out.

              – Amir A. Shabani
              39 mins ago





              Somehow I thought the variable used in for loop is immutable. +1 for pointing it out.

              – Amir A. Shabani
              39 mins ago











              1














              The left expression of a for loop statement gets assigned with each item in the iterable on the right in each iteration, so



              for n in a:
              print(n)


              is just a fancy way of doing:



              for i in range(len(a)):
              n = a[i]
              print(n)


              Likewise,



              for a[-1] in a:
              print(a[-1])


              is just a fancy way of doing:



              for i in range(len(a)):
              a[-1] = a[i]
              print(a[-1])


              where in each iteration, the last item of a gets assigned with the next item in a, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2.






              share|improve this answer



























                1














                The left expression of a for loop statement gets assigned with each item in the iterable on the right in each iteration, so



                for n in a:
                print(n)


                is just a fancy way of doing:



                for i in range(len(a)):
                n = a[i]
                print(n)


                Likewise,



                for a[-1] in a:
                print(a[-1])


                is just a fancy way of doing:



                for i in range(len(a)):
                a[-1] = a[i]
                print(a[-1])


                where in each iteration, the last item of a gets assigned with the next item in a, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2.






                share|improve this answer

























                  1












                  1








                  1







                  The left expression of a for loop statement gets assigned with each item in the iterable on the right in each iteration, so



                  for n in a:
                  print(n)


                  is just a fancy way of doing:



                  for i in range(len(a)):
                  n = a[i]
                  print(n)


                  Likewise,



                  for a[-1] in a:
                  print(a[-1])


                  is just a fancy way of doing:



                  for i in range(len(a)):
                  a[-1] = a[i]
                  print(a[-1])


                  where in each iteration, the last item of a gets assigned with the next item in a, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2.






                  share|improve this answer













                  The left expression of a for loop statement gets assigned with each item in the iterable on the right in each iteration, so



                  for n in a:
                  print(n)


                  is just a fancy way of doing:



                  for i in range(len(a)):
                  n = a[i]
                  print(n)


                  Likewise,



                  for a[-1] in a:
                  print(a[-1])


                  is just a fancy way of doing:



                  for i in range(len(a)):
                  a[-1] = a[i]
                  print(a[-1])


                  where in each iteration, the last item of a gets assigned with the next item in a, so when the iteration finally comes to the last item, its value got last assigned with the second-last item, 2.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 48 mins ago









                  blhsingblhsing

                  43.5k41744




                  43.5k41744





















                      1














                      a[-1] refers to the last element of a, in this case a[3]. The for loop is a bit unusual in that it is using this element as the loop variable.
                      It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.



                      So first a[-1] gets set to 0, then 1, then 2. Finally, on the last iteration, the for loop retrieves a[3] which at that point is 2, so the list ends up as [0, 1, 2, 2].



                      A more typical for loop uses a simple local variable name as the loop variable, e.g. for x .... In that case, x is set to the next value upon each iteration. This case is no different, except that a[-1] is set to the next value upon each iteration. You don't see this very often, but it's consistent.






                      share|improve this answer

























                      • How does it actually gets set to 0, then 1, then 2 and finally 2? That's the confusing part!

                        – Amir A. Shabani
                        1 hour ago






                      • 1





                        Agree, I don't really understand by reading this answer

                        – gameon67
                        1 hour ago











                      • I expected it would be like saying for 3 in a: print(a[-1]) (because a[-1] was 3 at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.

                        – Nathan
                        1 hour ago











                      • It's set by the for loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.

                        – Tom Karzes
                        1 hour ago






                      • 1





                        "The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element a[-1] evaluates to, rather, it's using the index a[-1] itself. If you rephrase that statement, your answer becomes much more clear.

                        – Christian Dean
                        28 mins ago
















                      1














                      a[-1] refers to the last element of a, in this case a[3]. The for loop is a bit unusual in that it is using this element as the loop variable.
                      It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.



                      So first a[-1] gets set to 0, then 1, then 2. Finally, on the last iteration, the for loop retrieves a[3] which at that point is 2, so the list ends up as [0, 1, 2, 2].



                      A more typical for loop uses a simple local variable name as the loop variable, e.g. for x .... In that case, x is set to the next value upon each iteration. This case is no different, except that a[-1] is set to the next value upon each iteration. You don't see this very often, but it's consistent.






                      share|improve this answer

























                      • How does it actually gets set to 0, then 1, then 2 and finally 2? That's the confusing part!

                        – Amir A. Shabani
                        1 hour ago






                      • 1





                        Agree, I don't really understand by reading this answer

                        – gameon67
                        1 hour ago











                      • I expected it would be like saying for 3 in a: print(a[-1]) (because a[-1] was 3 at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.

                        – Nathan
                        1 hour ago











                      • It's set by the for loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.

                        – Tom Karzes
                        1 hour ago






                      • 1





                        "The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element a[-1] evaluates to, rather, it's using the index a[-1] itself. If you rephrase that statement, your answer becomes much more clear.

                        – Christian Dean
                        28 mins ago














                      1












                      1








                      1







                      a[-1] refers to the last element of a, in this case a[3]. The for loop is a bit unusual in that it is using this element as the loop variable.
                      It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.



                      So first a[-1] gets set to 0, then 1, then 2. Finally, on the last iteration, the for loop retrieves a[3] which at that point is 2, so the list ends up as [0, 1, 2, 2].



                      A more typical for loop uses a simple local variable name as the loop variable, e.g. for x .... In that case, x is set to the next value upon each iteration. This case is no different, except that a[-1] is set to the next value upon each iteration. You don't see this very often, but it's consistent.






                      share|improve this answer















                      a[-1] refers to the last element of a, in this case a[3]. The for loop is a bit unusual in that it is using this element as the loop variable.
                      It's not evaluating that element upon loop entry, but rather it is assigning to it on each iteration through the loop.



                      So first a[-1] gets set to 0, then 1, then 2. Finally, on the last iteration, the for loop retrieves a[3] which at that point is 2, so the list ends up as [0, 1, 2, 2].



                      A more typical for loop uses a simple local variable name as the loop variable, e.g. for x .... In that case, x is set to the next value upon each iteration. This case is no different, except that a[-1] is set to the next value upon each iteration. You don't see this very often, but it's consistent.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited 9 mins ago

























                      answered 1 hour ago









                      Tom KarzesTom Karzes

                      11.2k1926




                      11.2k1926












                      • How does it actually gets set to 0, then 1, then 2 and finally 2? That's the confusing part!

                        – Amir A. Shabani
                        1 hour ago






                      • 1





                        Agree, I don't really understand by reading this answer

                        – gameon67
                        1 hour ago











                      • I expected it would be like saying for 3 in a: print(a[-1]) (because a[-1] was 3 at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.

                        – Nathan
                        1 hour ago











                      • It's set by the for loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.

                        – Tom Karzes
                        1 hour ago






                      • 1





                        "The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element a[-1] evaluates to, rather, it's using the index a[-1] itself. If you rephrase that statement, your answer becomes much more clear.

                        – Christian Dean
                        28 mins ago


















                      • How does it actually gets set to 0, then 1, then 2 and finally 2? That's the confusing part!

                        – Amir A. Shabani
                        1 hour ago






                      • 1





                        Agree, I don't really understand by reading this answer

                        – gameon67
                        1 hour ago











                      • I expected it would be like saying for 3 in a: print(a[-1]) (because a[-1] was 3 at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.

                        – Nathan
                        1 hour ago











                      • It's set by the for loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.

                        – Tom Karzes
                        1 hour ago






                      • 1





                        "The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element a[-1] evaluates to, rather, it's using the index a[-1] itself. If you rephrase that statement, your answer becomes much more clear.

                        – Christian Dean
                        28 mins ago

















                      How does it actually gets set to 0, then 1, then 2 and finally 2? That's the confusing part!

                      – Amir A. Shabani
                      1 hour ago





                      How does it actually gets set to 0, then 1, then 2 and finally 2? That's the confusing part!

                      – Amir A. Shabani
                      1 hour ago




                      1




                      1





                      Agree, I don't really understand by reading this answer

                      – gameon67
                      1 hour ago





                      Agree, I don't really understand by reading this answer

                      – gameon67
                      1 hour ago













                      I expected it would be like saying for 3 in a: print(a[-1]) (because a[-1] was 3 at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.

                      – Nathan
                      1 hour ago





                      I expected it would be like saying for 3 in a: print(a[-1]) (because a[-1] was 3 at the start of the loop) and give an error, but clearly that's not the case. You're obviously correct about what's happening, but I'm surprised this evaluates this way.

                      – Nathan
                      1 hour ago













                      It's set by the for loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.

                      – Tom Karzes
                      1 hour ago





                      It's set by the for loop. Each time through, it gets set to the next element of the list. What's the first element? Right, it's 0. What's the second? Right again, it's 1. etc.

                      – Tom Karzes
                      1 hour ago




                      1




                      1





                      "The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element a[-1] evaluates to, rather, it's using the index a[-1] itself. If you rephrase that statement, your answer becomes much more clear.

                      – Christian Dean
                      28 mins ago






                      "The for loop is a bit unusual in that it is using this element as the loop variable." - This may be where the confusion is coming from. Python isn't using the element a[-1] evaluates to, rather, it's using the index a[-1] itself. If you rephrase that statement, your answer becomes much more clear.

                      – Christian Dean
                      28 mins ago











                      Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.









                      draft saved

                      draft discarded


















                      Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.












                      Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.











                      Kundan Verma is a new contributor. Be nice, and check out our Code of Conduct.














                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55644201%2fwhy-can-i-use-a-list-index-as-an-indexing-variable-in-a-for-loop%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Magento 2 duplicate PHPSESSID cookie when using session_start() in custom php scriptMagento 2: User cant logged in into to account page, no error showing!Magento duplicate on subdomainGrabbing storeview from cookie (after using language selector)How do I run php custom script on magento2Magento 2: Include PHP script in headerSession lock after using Cm_RedisSessionscript php to update stockMagento set cookie popupMagento 2 session id cookie - where to find it?How to import Configurable product from csv with custom attributes using php scriptMagento 2 run custom PHP script

                      Can not update quote_id field of “quote_item” table magento 2Magento 2.1 - We can't remove the item. (Shopping Cart doesnt allow us to remove items before becomes empty)Add value for custom quote item attribute using REST apiREST API endpoint v1/carts/cartId/items always returns error messageCorrect way to save entries to databaseHow to remove all associated quote objects of a customer completelyMagento 2 - Save value from custom input field to quote_itemGet quote_item data using quote id and product id filter in Magento 2How to set additional data to quote_item table from controller in Magento 2?What is the purpose of additional_data column in quote_item table in magento2Set Custom Price to Quote item magento2 from controller

                      How to solve knockout JS error in Magento 2 Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?(Magento2) knockout.js:3012 Uncaught ReferenceError: Unable to process bindingUnable to process binding Knockout.js magento 2Cannot read property `scopeLabel` of undefined on Product Detail PageCan't get Customer Data on frontend in Magento 2Magento2 Order Summary - unable to process bindingKO templates are not loading in Magento 2.1 applicationgetting knockout js error magento 2Product grid not load -— Unable to process binding Knockout.js magento 2Product form not loaded in magento2Uncaught ReferenceError: Unable to process binding “if: function()return (isShowLegend()) ” magento 2