>source

이 for 루프가 정확히 어떻게 작동하는지 이해하려고 합니다. 문자 목록(first_list= ["A","B","C"])이 있고 각 문자 없이 가능한 모든 목록을 인쇄하고 싶습니다(["B","C"]; ["A ","C"], ["A","B"]). 이 루프가 있지만 작동하지 않는 이유를 이해하지 못합니다.

first_list= ["A","B","C"]
for i in first_list:
    second_list= first_list
    second_list.remove(i)
    print(second_list)
--> ['B', 'C']
    ['B']

반면에 이 루프가 있고 작동하지만 작동하는 이유와 두 루프의 차이점을 이해하지 못합니다.

first_list= ["A","B","C"]
for i in first_list:
    first_list= ["A","B","C"]
    second_list= first_list
    second_list.remove(i)
    print(second_list)
-->['B', 'C']
   ['A', 'C']
   ['A', 'B']

이 두 for 루프의 작동 방식을 이해하는 데 도움을 줄 수 있습니까? 이 출력을 얻을 수 있는 다른 방법이 있습니까(for 루프가 아닌 다른 방법으로)?

  • 답변 # 1

    재사용된 지역변수를 삭제하면first_list, 이해하기 쉬워집니다.

    for i in ["A", "B", "C"]:
        selections= ["A", "B", "C"]
        selections.remove(i)
        print(selections)
    

    이 프로그램은 조합 프로그램입니다(3픽 2). python itertools 조합()을 사용하여 이 출력을 생성할 수 있습니다.

    >>> from itertools import combinations
    >>> list(combinations(['A', 'B', 'C'], 2))
    [('A', 'B'), ('A', 'C'), ('B', 'C')]
    

  • 답변 # 2

    이것은 파이썬이 참조를 할당하기 때문에 발생합니다. 이 작업을 수행할 때 값 대신 주소를 할당하기만 하면 됩니다.두 번째_목록= 첫 번째_목록["A","B","C"]의 주소(이것은 개체이고 주소가 있음)가 second_list 변수에 할당됩니다. 이제 first_list와 second_list는 동일한 주소를 가리킵니다. 즉, 변수 중 하나가 다른 객체를 가리킬 때까지 모든 변수의 변경이 다른 변수에 반영됨을 의미합니다.first_list= ["A","B","C"]이 작업을 수행할 때마다 이 새 개체가 생성되고 해당 주소가 해당 특정 변수에 할당되어 두 번째 code에서 작동합니다. 자세한 설명은 이 링크를 참조하십시오 참조 작동 방식

    first_list= ["A","B","C"]
    for i in first_list:
        second_list= first_list.copy()
        second_list.remove(i)
        print(second_list)
    

  • 답변 # 3

    첫 번째 code 스니펫에서두 번째_목록메모리의 동일한 위치를 가리키기 위해first_list. 따라서 변경(즉, 삭제)두 번째_목록에도 반영됩니다first_list. 두 번째 code 조각에서 다시 초기화합니다.first_list에게["알파벳"]모든 반복이 시작될 때~을위한고리. 이 경우 모든 반복에 대해 새로운 목록에서 작업하고 있습니다.

    주어진 반복에 대해 제거할 요소를 결정하려면 일종의 반복 구조를 사용해야 하지만 목록 이해를 사용하여 더 간결하게 만들 수 있습니다.

    first_list= ["A","B","C"]
    for skip_index in range(len(first_list)):
        print([elem for index, elem in enumerate(first_list) if index != skip_index])
    

  • 답변 # 4

    목록에 대해 가능한 모든 조합을 얻으려면 다음을 사용할 수 있습니다.itertools.combinations!

    import itertools
    [combination for combination in itertools.combinations(["A","B","C"], 2)]
    

    다음 결과를 제공합니다:

    [('A', 'B'), ('A', 'C'), ('B', 'C')]

  • 이전 Django 나머지 프레임워크 포인트 추가 요청
  • 다음 java : 사용자가 대략적인 위치 정보 권한을 부여하면 Android 12 앱이 충돌합니다.